Description
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
Input
第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
Output
对于每一个N,输出一行新朋友的人数,这样共有CN行输出。
Sample Input
2 25608 24027
Sample Output
768016016
板子题
#include<set> #include<map> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<bitset> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #define rep(i,j,k) for (int i = j; i <= k; i++) #define per(i,j,k) for (int i = j; i >= k; i--) #define loop(i,j,k) for (int i = j;i != -1; i = k[i]) #define lson x << 1, l, mid #define rson x << 1 | 1, mid + 1, r #define ff first #define ss second #define mp(i,j) make_pair(i,j) #define pb push_back #define pii pair<int,LL> #define inone(x) scanf("%d", &x); #define intwo(x,y) scanf("%d%d", &x, &y); using namespace std; typedef unsigned long long LL; const int low(int x) { return x&-x; } const double eps = 1e-4; const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 1e5 + 10; int T, n; int f[N], p[N], phi[N], t = 0; void init() { phi[1] = f[1] = 1; rep(i, 2, N - 1) { if (!f[i]) p[t++] = i, phi[i] = i - 1; for (int j = 0, k; j < t&&p[j] * i < N; j++) { f[k = p[j] * i] = 1; phi[k] = phi[i] * (p[j] - 1); if (i%p[j] == 0) { phi[k] = phi[i] * p[j]; break; } } } } int main() { init(); inone(T); while (T--) { inone(n); printf("%d\n", phi[n]); } return 0; }