欧拉降幂公式:http://blog.csdn.net/acdreamers/article/details/8236942
糖教题解处:http://blog.csdn.net/skywalkert/article/details/43955611
注:知道欧拉公式是远远不够的,还要知道欧拉降幂公式,因为当指数很大的时候需要用
然后欧拉降幂公式不要求A,C互质,但是B必须大于等于C的欧拉函数
吐槽:感觉记忆化搜索影响不大啊,当然肯定是因为太水了
这样复杂度是O(T*sqrt(p)*logp)
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <stack> #include <map> using namespace std; typedef long long LL; const int N = 11; int qpow(int a,int b,int mod){ int ret=1; while(b){ if(b&1)ret=1ll*ret*a%mod; a=1ll*a*a%mod; b>>=1; } return ret; } int eular(int x){ int ret=x; for(int i=2;i*i<=x;++i){ if(x%i)continue; ret=ret/i*(i-1); while(x%i==0)x/=i; } if(x>1)ret=ret/x*(x-1); return ret; } int f(int x){ if(x==1)return 0; int phi=eular(x); return qpow(2,f(phi)+phi,x); } int main(){ int T; scanf("%d",&T); while(T--){ int p; scanf("%d",&p); printf("%d ",f(p)); } return 0; }