POJ 2154 Color

来源:互联网 发布:剑网三李白脸型数据 编辑:程序博客网 时间:2024/05/17 05:17

用欧拉函数优化的polya原理

转自acdreamers

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 36000;int vis[maxn], prime[maxn];int T, n, p;void init(){    //素数筛    memset(vis, 0, sizeof(vis));    int tot = 0;    for(int i = 2; i < maxn; i++) if(!vis[i]){        prime[tot++] = i;        for(int j = i*i; j < maxn; j += i) vis[j] = 1;    }}int phi(int n){   //求解欧拉函数    int ret = n;    for(int i = 0; prime[i]*prime[i] <= n; i++){        if(n%prime[i] == 0){            ret -= ret/prime[i];            while(n%prime[i] == 0) n /= prime[i];        }    }    if(n > 1) ret -= ret/n;    return ret;}int quick_pow(int a, int b, int p){  //快速幂    int ret = 1;    a %= p;   //注意这里,不然直接爆int    while(b){        if(b&1) ret = (ret*a)%p;        b >>= 1;        a = (a*a)%p;    }    return ret;}int main(){    init();    scanf("%d", &T);    while(T--){        scanf("%d%d", &n, &p);        int ans = 0;        for(int i = 1; i*i <= n; i++){            if(i*i == n)                ans = (ans + phi(n/i)%p*quick_pow(n, i-1, p))%p;            else if(n%i == 0)                ans = (ans + phi(n/i)%p*quick_pow(n, i-1, p) + phi(i)%p*quick_pow(n, n/i-1, p))%p;        }        printf("%d\n", ans%p);    }    return 0;}
0 0
原创粉丝点击