#include<cstdio>
using namespace std;
int n,p;
int euler(int x)
{
int ret=1;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
{
x/=i;ret*=i-1;
while(x%i==0) {x/=i;ret*=i;}
}
}
if(x>1) ret*=x-1;
return ret%p;//开始这么没有模p,导致WA
}
int Pow(int a,int b)
{
int result=1;
int base=a%p;
while(b)
{
if(b&1) result=(result*base)%p;
base=(base*base)%p;
b=b>>1;
}
return result%p;
}
void gcd(int a,int b,int &d,int &x,int &y)
{
if(!b) {d=a;x=1;y=0;}
else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int polya()
{
int result=0;
for(int i=1;i*i<=n;i++)
{
if(n%i) continue;
result=(result+euler(i)*Pow(n,n/i-1))%p;
if(i*i==n) break;
result=(result+euler(n/i)*Pow(n,i-1))%p;
}
return result;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&p);
printf("%d\n",polya());
}
return 0;
}
POJ 2154 Color
最新推荐文章于 2018-05-18 15:08:26 发布