POJ 1284
 
求原根个数:
  即求 euler(euler(p)) = euler(p-1) 其中p为奇素数
  又有 euler(x) = x*(1-1/p1)*...*(1-1/pk)  其中pk为x的质因数
#include <cstdio>
#include <cstring>

int all, p, ans, num[100000];
bool pd[100000];

int main()
{
    pd[1] = 1;
    for(int i = 1; i < 100000; i++)
        if(!pd[i])
        {
            num[all++] = i;
            for(int j = i+i; j < 100000; j += i)
                pd[j] = 1;
        }
    while(scanf("%d", &p) != EOF)
    {
        ans = --p;
        for(int i = 0; i < all && num[i] <= p; i ++)
            if(p%num[i] == 0)
                ans = ans/num[i]*(num[i]-1);
        printf("%d\n", ans);
    }
    return 0;
}
View Code

相关文章: