poj 2154 Color(polya + 欧拉函数)

来源:互联网 发布:巴萨拉菲尼亚数据 编辑:程序博客网 时间:2024/06/09 09:05

参考: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;}
原创粉丝点击