[cpp] /* 類型:數論 給你一個N,讓你找到最小的M使得(2 ^ N - 1) % (2 ^ M - 1) = 0。 2 ^ N的二進制數一定是1後面跟隨一些0,那麼2 ^ N - 1的二進制數每一位上都是1了, 所以要想使(2 ^ N - 1) % (2 ^ M - 1) = 0, 那麼其實只要使2 ^ N - 1的二進制數裡1的個數能整除2 ^ M - 1的二進制裡1的個數就能保證(2 ^ N - 1) % (2 ^ M - 1) = 0。(想一想為什麼) 當輸入N時,那麼(2 ^ N - 1)的二進制數的1的個數就是N。 那麼此題就是一道水題了,問題變成了求N的最小質因數M。 解析:這道題目很奇葩,算是主要考察 二進制的算法吧。。 比如說:10101010 有因子1,10,1010,,也就是說可以分成整數個相同的子片段,或者將二進制末尾去0,如1010101片段 該子片段就能整除原段。。 */ #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ int flag=0; if(n%2==0) { ///剪枝 printf("2\n"); continue; } www.2cto.com int x=(int)sqrt(1.0*n); for(int i=3;i<=x;i+=2) if(n%i==0){ printf("%d\n",i); flag=1; break; } if(!flag) printf("%d\n",n); } }