首页 > 代码库 > 《刘汝佳算法竞赛入门经典》第五章 数论

《刘汝佳算法竞赛入门经典》第五章 数论

Skew Binary 斜二进制

斜二进制的每位为0, 或 1, 最低位可以为2. 第k位的。。。代表 2k+1 -1,给出一个斜二进制数,把他转换成十进制数。正常模拟就好

 1 #include <cstdio> 2 #include <cstring> 3 char A[1000]; 4  5 int main() { 6    while (scanf("%s", A) != EOF) { 7        if (A[0] == 0) break; 8        int len = strlen(A); 9        int ans = 0;10        for (int i = len-1; i >= 0; i--) 11            ans += (A[i] - 0)* ((1 << (len-i)) -1);12        printf("%d\n", ans);13    }14    return 0;15 }
View Code

 

Light, more light 灯光

一个走廊里有n个灯泡灭着,一个人从第1个灯走到第n个灯算走一次(从第n个灯走回来不算),这个人一共会走n次,每次走到第i个灯泡的时候,如果n能被i整除,他会改变这个灯的状态,求他走了n次之后,最后一盏灯是否是亮着的

计算从1到n,n有多少个因子,如果是奇数个就是灭的,偶数个就是亮的 (第一发交了暴力超时了) 。。。。。。。。。。。。。。。搜题解!!

关键是判断这个n是不是某个数的平方,如果是的话会被改变状态奇数次,能被打开。p.s.灯泡初始状态是灭的是从数据看出来的。。。还有会爆int

 1 #include <cstdio> 2 #include <cmath> 3 typedef long long LL; 4  5 int main() { 6     LL n; 7     while (scanf("%lld", &n) != EOF && n) { 8         LL k = (LL)sqrt(n*1.0); 9         if (k*k == n) puts("yes");10         else puts("no");11     }12     return 0;13 }
View Code

 

Multiplying by Rotation 移位除法

 每行3个数,n,a,b。n表示进制数,a,b没读懂

 

Just the Facts  阶乘

按照格式输出一个数n的阶乘的最后一个非0数字

思路:最后一位只与最后一位有关(好绕),应该没几种情况

1! = 1, 2! = 2, 3! = 6; 4! = 8, 5!= 4, 6! = 4, 7! = 8, 8!= 4, 9! = 6, 10! = 6, 11 ! = 6; 12 ! = 2, 13 ! = 6

 

《刘汝佳算法竞赛入门经典》第五章 数论