因为2为偶数,一为奇数,所以n一定是为奇数,才可能。取余相当于减法运算,所以可以确定是奇数;
所以先排除偶数和一,
穷举法进行运算。
1、用下面代码,中间进行求余运算,避免超时
2、用for(i=2;;i=(i%n)*2)//中国求余定理
m++;//计算次数;
3、费马小定理,a和n互质,a^(n-1)modn==1;a和n互质,这只是证明当n为奇数的时候一定有x满足a^xmodn=1;但是x不一定为n-1;可能为更小一些的数
if(i%n==1)break;
#include<stdio.h>
int main()
{
int n,i,b;
while(scanf("%d",&n)!=EOF)
{ b=1;
if((n%2==0)||(n==1))
{printf("2^? mod %d = 1\n",n);continue;}
for(i=1;;i++)
{
b*=2;
b=b%n;//用一次取余,否则数太大,会超时
if(b==1)
{printf("2^%d mod %d = 1\n",i,n);break;}
}
}
return 0;
}