题目描述:
求 2222...2 2 2 2 2 . . . 2 %p的值
题目分析:
欧拉降幂大法!
题解移步此处
题目链接:
Ac 代码:
#include <cstdio>
#include <iostream>
#include <map>
#include <cmath>
#define int long long
std::map<int,int> f;
inline int fastpow(int x,int y,int mod)
{
int ans=1;
for(;y;y/=2,x=(x*x)%mod)
if(y&1) ans=(ans*x)%mod;
return ans;
}
inline int phi(int x)
{
int ans=x;
for(int i=2;i*i<=x;i++)
if(!(x%i))
{
ans-=ans/i;
while(!(x%i)) x/=i;
}
if(x>1) ans-=ans/x;
return ans;
}
inline int F(int x)
{
if(f.find(x)!=f.end()) return f[x];
int p=phi(x);
return f[x]=fastpow(2,F(p)+p,x);
}
main()
{
int t,n;
f[1]=0;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
printf("%lld\n",F(n));
}
return 0;
}