利用x<n的信息,可以证得当n为素数时,he[n]=2;同时,若n 为素数,则有HE[N^K]=2;因为若等式成立则有n|x(x-1)。抓住这个证即可。
至于符合积性函数,想了很久也没想出来,看了看网上的,觉得是不对的。
但试过几个数后,确实符合积性函数,就当是猜想吧。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #define LL __int64 using namespace std; const LL N=10000005; bool isprime[N]; int pme[N],np; void initial(){ memset(isprime,true,sizeof(isprime)); np=0; isprime[1]=false; for(LL i=2;i<N;i++){ if(isprime[i]){ pme[np++]=i; for(LL j=i*i;j<N;j+=i){ isprime[j]=false; } } } } LL work(LL n){ LL rs=0; for(int i=0;i<np&&pme[i]<=n;i++){ rs+=(n/pme[i]); } return rs; } LL quick(LL a,LL b,LL m){ LL res=1; while(b){ if(b&1) res=(res*a)%m; b>>=1; a=(a*a)%m; } return res; } int main(){ LL n,m; int T; initial(); scanf("%d",&T); while(T--){ scanf("%I64d%I64d",&n,&m); LL k=work(n); LL ans=quick((LL)2,k,m); printf("%I64d ",ans); } return 0; }