#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
LL t,e[1000];
LL mod;
LL euler_phi(LL n)//欧拉函数
{
LL m=sqrt(n+0.5);
LL ans=n,i;
for(i=2;i<=m;i++)
{
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)n=n/i;
}
}
if(n>1)ans=ans/n*(n-1);
return ans;
}
void find(LL n)
{
LL i;
e[t++]=n;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
if(i*i==n)
e[t++]=i;
else
{
e[t++]=i;
e[t++]=n/i;
}
}
}
}
LL pows(LL a,LL b)
{
LL s=1;
while(b)
{
if(b&1)
s=(s*a)%mod;
a=(a*a)%mod;
b=b>>1;
}
return s;
}
int main()
{
LL n;
while(cin>>n)
{
if(n%2==0||n==1)
cout<<"2^? mod "<<n<<" = 1"<<endl;
else
{
LL m,ans,i,s=2;
/*for(i=2;;i++)//直接暴力的方法
{
s=(s*2)%n;
if(s==1)
break;
}
ans=i;*/
m=euler_phi(n);
t=0;
find(m);
sort(e,e+t);
mod=n;
for(i=0;i<t;i++)
{
if(pows(2,e[i])==1)
{
ans=e[i];
break;
}
}
cout<<"2^"<<ans<<" mod "<<n<<" = 1"<<endl;
}
}
return 0;
}
/*
这题数据很水,可以直接暴力出来。
我要讲的使用定理求解这道题:
本题很容易发现n为偶数或者0时无解。所以2和n必定互质
欧拉定理:a^(euler_phi(n))≡1(mod n),(a,n互质)
其中euler_phi为欧拉函数,计算不超过n且与n互质的个数。求法是n*∏(pi-1)/pi,pi为n的质因子
m=euler_phi(n);
所以a^m%mod=1,不过m不一定是最小循环,但m是一个循环,则最小循环不定时m的一个因子,因而找出所有m的因子,暴力
搜索下就OK了
*/
hdu 1395 2^x mod n = 1 欧拉定理(当然可以直接暴力)
最新推荐文章于 2025-02-14 14:07:05 发布