接下来T行,每行一个正整数p,代表你需要取模的值
标签:四种 phi solution 分享 data 技术分享 pac 题意 can
g2(p))–线性筛/O(log2(p)*sqrt(p))–直接计算。
实践过程中第二种方法远远快于第一种。
· Solution 2
还是根据公式
设答案为f(p),有
同样递归求解即可,复杂度同第一个解。
[Code]
给出两种解法的代码,第一种用的线性筛,第二种直接求解。
#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #define ll long long using namespace std; int Phi(int x){ int ans=x; for(int i=2,lim=sqrt(x)+1;i<lim;i++) if(!(x%i)){ ans-=ans/i; while(!(x%i)) x/=i; } return x>1?ans-ans/x:ans; } ll pow(ll a,ll n,ll p){ ll ans=1; while(n){ if(n&1) ans=ans*a%p; a=a*a%p; n>>=1; } return ans; } ll f(int x) { if(x==1) return 0; int phi=Phi(x); return pow(2,f(phi)+phi,x); } int main() { int cas; scanf("%d",&cas); while(cas--) { int x; scanf("%d",&x); printf("%lld\n",f(x)); } }
标签:四种 phi solution 分享 data 技术分享 pac 题意 can
原文地址:http://www.cnblogs.com/dancer16/p/7718454.html