题目大意:给定一个n,求出最小的x满足2^x%n==1,如过存在就输出x不存在就输出?
首先这题我们可以很直观的看出,n若为偶数,则必定不存在,因为2^x必定为偶数,偶数对偶数取余,不可能为奇数
那么接下来就只用看n为奇数的情况了,其实n为奇数的时候一定存在,现在给出证明
根据鸽巢原理,可知一定存在同余的情况假设2^x2>2^x1,且同余数,则有
(2^x2-2^x1)%n==0
2^x1(2^(x2-x1)-1)%n==0
又因为2^x1%n为奇数
所以2^(x2-x1)%n==1成立
故可知x的取值范围一般在1~n之间
所以如果n为偶数时可以直接判断,n为奇数暴力求解即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)){
if (n%2==0||n<3){
printf("2^? mod %d = 1\n",n);
}
else
{
int ans=1;
for (int i=1;;i++){
ans=ans*2;
if (ans%n==1){
printf("2^%d mod %d = 1\n",i,n);
break;
}
ans=ans%n;
}
}
}
return 0;
}