Sicily 1009. Mersenne Composite N

来源:互联网 发布:怎样做好淘宝店铺 编辑:程序博客网 时间:2024/06/06 09:40


分析:

这道题可以简单的暴力算出0~63范围内满足要求的结果,然后直接打表。但是个人认为这种行为有点类似作弊。下面提供我的做法。

中间的代码都很好写,就是在因数分解的时候优化算法的过程。我自己没有想出好一点的做法,在网上参考了其他人的做法。大概解释一下,请看代码注释

Run Memory 288KB

Run Time  0.07sec


#include <stdio.h>#include <math.h>// 判断是否为质数bool isPrime (long long int n);int main() {int n;scanf("%d", &n);long long int factor[64] = {0}; // 存储因数的数组int count;for (int i = 2; i <= n; i ++) {count = 0;long long int uncheck = (1LL << i)-1;  // 移位得出 2^n-1 的值if (i > 59 || i < 11 || !isPrime(i))  // 直接忽略小于11和大于59continue;        long long int result = uncheck;long long int max = result;for(long long i=3; i <= max; i+= 2){            if(isPrime(i) && result % i == 0){factor[count++] = i;                result /= i;if(isPrime(result)){      // 此处避免了很多运算,在进入下一步循环之前先判断是否质数,如果是则直接退出循环factor[count++] = result;break;}} else {                max = result / i;            }}        if (count) {for (int j = 0; j < count - 1; j ++)printf("%lld * ", factor[j]);            printf("%lld = %lld = ( 2 ^ %d ) - 1\n", factor[count - 1], (1LL << i)-1, i);}}return 0;}bool isPrime (long long int n) {int sqrtN = sqrt((double)n);    if (n%2 == 0)        return false;for (int i = 3; i <= sqrtN; i += 2)if (n%i == 0)return false;return true;}


网上的朋友有直接打表的,参考http://blog.sina.com.cn/s/blog_8c759b690100zr69.html

还有只对已知结果进行计算的,参考http://www.cnblogs.com/mjc467621163/archive/2011/07/04/2097278.html

中间因数分解参考xinlinqi在github上的代码https://github.com/xinlinqi/Sicily/blob/master/1009.Mersenne%20Composite%20N.cpp

0 0
原创粉丝点击