Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8942 Accepted Submission(s): 4715
2 25608 24027
7680 16016
欧拉函数:
#include <cstdio> #include <cstring> #define LL long long #define MAX 32768+1 using namespace std; int eu[MAX]; void euler()//打表求出所有数的欧拉函数 { int i, j; for(i = 2; i < MAX; i++) { if(!eu[i]) { for(j = i; j < MAX; j += i) { if(!eu[j]) eu[j] = j; eu[j] = eu[j]/i*(i-1); } } } } int main() { int t, n; euler(); scanf("%d", &t); while(t--) { scanf("%d", &n); printf("%d\n", eu[n]); } return 0; }
容斥原理:
#include <cstdio> #include <cstring> #define MAX 32768+1 using namespace std; int p[20], k; void getp(int n)//求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)//求1到n有多少个数 与 n不互质 { int top = 0; int i, j, que[10100]; 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 t, n; scanf("%d", &t); while(t--) { scanf("%d", &n); printf("%d\n", n-nop(n)); } return 0; }