数论中小技巧:因为每次只需要一个大数 mod n 的余数,所以为了计算机运算的方便,先进行转换一下..
( a * b ) % n = [ ( a % n ) * ( b%n ) ] % n ;
( a + b ) %n = [ ( a%n ) +( b%n ) ] %n ;
题意:中文
思路:欧拉定理,不过它是要求最小的整数,所以只能用欧拉定理来判断优化...
例如: 2^k mod n = 1 ; 则 k = E (n) 一定是成立的;而且如果该等式成立,那么(2,n)一定是互质的(欧拉定理),就不证明了...
最后用暴力来求吧,想不到更好的办法了...
代码:
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n%2==0 || n==1) {
printf("2^? mod %d = 1\n",n);
continue;
}
else{
int sum=1;
for(int i=1 ; ; i++ ){
sum *= 2;
if(sum%n==1){
printf("2^%d mod %d = 1\n",i,n);
break;
}
sum = sum%n;
}
}
}
}