#include<iostream>
#define N 1000010
#define ui64 int //unsigned __int64
using namespace std;
ui64 cnt[N];
ui64 euler(int n)
{
ui64 euler=n,i,nn=n;
if(n==1) return 1;
for(i=2;i*i<=n;i++)
{
if(i%nn==0)
{
euler-=euler/i;
while(nn%i==0) nn/=i;
}
if(nn==1) break;
}
if(n==nn) euler=n-1;
if(nn!=n&&nn!=1) euler=euler-euler/nn;
return euler;
}
ui64 mul(ui64 a,ui64 b,ui64 n)
{
ui64 ret=0;
while(b)
{
if(b&1) ret+=a;
if(ret>=n) ret-=n;
if(a>=n) a-=n;
a<<=1;
b>>=1;
}
return ret;
}
ui64 pow(ui64 a,ui64 e, ui64 n)
{
int ret =1;
while(e)
{
if(e&1) ret = mul(ret,a,n);
a = mul(a,a,n);
e>>=1;
}
return ret;
}
int main()
{
int p,i,pe,b,ans,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
for(i=0;i<p;i++) cnt[i]=0;
ans=0;
pe=euler(p);
for(i=1;i<p;i++)
{
b=i%pe+pe;
cnt[pow(i,b,p)]++;
}
for(i=1;i<=p-i;i++)
{
ans+=cnt[i]*cnt[p-i];
}
// for(i=0;i<p;i++) cout<<cnt[i]<<endl;
ans+=cnt[0]*cnt[0];
printf("%d/n",ans);
}
return 0;
}
计数问题(TLE)o(╯□╰)o
最新推荐文章于 2024-09-25 11:34:05 发布