洛谷P4139 上帝与集合的正确用法
TITLE
思路
欧拉定理
a
b
≡
a
b
m
o
d
ϕ
(
m
)
+
ϕ
(
m
)
a^b \equiv a^{b\mod \phi(m)+\phi(m)}
ab≡abmodϕ(m)+ϕ(m)
代入公式计算即可
若ab,b<=2,return 0
否则return
2
ϕ
(
x
)
+
函
数
自
己
(
ϕ
(
x
)
)
m
o
d
b
2^{\phi(x)+函数自己(\phi(x))}\mod b
2ϕ(x)+函数自己(ϕ(x))modb
long long ExEulerTheorem(long long x)
{
if(x<3)return 0;
long long tem=phi(x);
return ksm(2,tem+ExEulerTheorem(tem),x);
}
CODE
#include<iostream>
#include<cstdio>
using namespace std;
long long ksm(long long x,long long y,long long mods)
{
long long ans;
for(ans=1;y;x=x*x%mods,y>>=1)
if(y&1)ans=ans*x%mods;
return ans;
}
long long phi(long long x)
{
long long i,ans=x;
for(i=2;i*i<=x;++i)
if(x%i==0)
for(ans=ans/i*(i-1);x%i==0;x/=i);
if(x>1)ans=ans/x*(x-1);
return ans;
}
long long ExEulerTheorem(long long x)
{
if(x<3)return 0;
long long tem=phi(x);
return ksm(2,tem+ExEulerTheorem(tem),x);
}
int main()
{
int T,x;
for(scanf("%d",&T);T;--T)
scanf("%d",&x),printf("%d\n",ExEulerTheorem(x));
return 0;
}