2 25608 24027
7680 16016
法一:筛选法
#include <cstdio> #include <cstring> using namespace std; int main(){ int a[33000]; int t, N, i, j, k, n, m; scanf("%d", &t); while (t-- && scanf("%d", &N)){ int sum = 0; memset(a, 0, sizeof(a)); for (i = 2; i <= N / 2; i++){ if (N % i == 0){ for (j = i; j < N; j = j + i){ if (a[j] == 0) a[j] = 1; } } } for (i = 1; i < N; i++){ if (a[i] == 1){ sum += a[i]; } } printf("%d\n", i - sum - 1); } return 0; }
#include <cstdio> #include <cstring> using namespace std; int euler(int n){ int ret = n, i; for (i = 2; i * i <= n; i++){ if (n % i == 0){ ret = ret - ret / i; while (n % i == 0) n = n / i; } } if (n > 1) ret = ret - ret / n; return ret; } int main(){ int t; int N; scanf("%d", &t); while (t-- && scanf("%d", &N)){ printf("%d\n", euler(N)); } return 0; }