标签:题解 集合 map scan tar code std ace class
首先题目需要用到欧拉函数的一个性质
$\forall x\geq \phi(p)$
$a^x\equiv a^{x \; mod \; \phi(p) + \phi(p)}(mod\;p)$
设$f(p) = 2^{2^{2^{...}}}mod \; p$
$f(p)=2^{(2^{2^{...}} mod \; \phi(p)) + \phi(p)}mod \; p \\=2^{f(\phi(p)) + \phi(p)} mod \; p$
关于f(p)的递推式知道了,只要dfs就可以了。
时间复杂度$O(\sqrt{p}logp)$
map的作用就是记录取模x的时候的值
#include <cstdio> #include <map> using namespace std; map<int,int>vis; int pow(int x,int k,int p){ int ans = 1; while(k){ if(k&1) ans=(long long )ans*x%p; x = (long long)x * x % p; k>>=1; } return ans; } int phi(int x){ int ans = x; for(int i=2;i*i<=x;i++){ if(x%i==0){ ans -= ans/i; while(x%i==0) x/=i; } } if(x>1) ans -= ans/x; return ans; } int dfs(int x){ if(vis.count(x)) return vis[x]; int p = phi(x); return vis[x] = pow(2,dfs(p)+p,x); } int main(){ int t,n; scanf("%d",&t); vis[1]=0; while(t--){ scanf("%d",&n); printf("%d\n",dfs(n)); } return 0; }
标签:题解 集合 map scan tar code std ace class
原文地址:http://www.cnblogs.com/OIerLYF/p/7504243.html