参考:http://blog.csdn.net/u014492306/article/details/43196743 不知道怎么用欧拉函数优化,就找题解喽,感觉这个讲的挺好的 如果先把素数筛出来,再求欧拉函数就要快多了
#include <cstdio> int n,p; int res = 0; int euler(int num) { int ret = num; for(int i = 2; i*i <= num; ++i) { if(num%i == 0) { ret = ret/i*(i-1); while(num%i == 0) num /= i; } } if(num != 1) ret = ret/num*(num-1); return ret%p; } int modPow(int a, int b) { int ret = 1; a = a%p; while(b) { if(b&1) ret = ret*a%p; a = a*a%p; b >>= 1; } return ret; } void polya() { int ret = 0; for(int l = 1; l*l <= n; ++l) { if(n%l) continue; ret = (ret + euler(l)*modPow(n,n/l-1))%p;//这里n/l-1,最后就不用除以n了 if(l*l == n) break; ret = (ret + euler(n/l)*modPow(n,l-1))%p; } res = ret; } int main() { int X; scanf("%d",&X); while(X--) { scanf("%d%d",&n,&p); polya(); printf("%d\n",res); } return 0; }