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; }