Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11929 | Accepted: 5841 |
Description
Input
Output
Sample Input
7 12 0
Sample Output
6 4
求1到n-1里面与n互质的数的个数。 欧拉打表1000000000太大,用容斥原理。
#include <cstdio> #include <cstring> #include <cmath> #define LL long long #define MAX 10000000 using namespace std; int p[1000], k; void getp(int n) { int i, j; k = 0; for(i = 2; i*i <= n; i++) { if(n % i == 0) { p[k++] = i; while(n % i == 0) n /= i; } } if(n > 1) p[k++] = n; } int nop(int n) { int top = 0; int i, j, que[100000]; que[top++] = -1; for(i = 0; i < k; i++) { int t = top; for(j = 0; j < t; j++) que[top++] = que[j]*p[i]*(-1); } int sum = 0; for(i = 1; i < top; i++) sum += n/que[i]; return sum; } int main() { int n; while(scanf("%d", &n), n) { getp(n); printf("%d\n", n-nop(n)); } return 0; }