找新朋友

来源:互联网 发布:网络报装 编辑:程序博客网 时间:2024/06/06 04:21

Description

新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
 

Input

第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
 

Output

对于每一个N,输出一行新朋友的人数,这样共有CN行输出。 
 

Sample Input

22560824027
 

Sample Output

768016016


#include<cctype>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<queue>#include<stack>#include<set>#include<map>#define REP(i,a,b) for (i=(a);i<=(b);i++)#define CLEAR(a) memset((a),0,sizeof((a)))#pragma comment(linker, "/STACK:1024000000 , 1024000000")using namespace std;typedef long long LL;const double pi = acos(-1.0);const int maxn = 4e4;const float eps = 1e-3;int n;int  phi[maxn + 1];void init();void solve();void outp();void get_prime(){    CLEAR(phi);    phi[1] = 1;    for (int i = 2; i < maxn; i++)        if (!phi[i])        {            phi[i] = i - 1;            for (int j = 2; i * j <= maxn; j++)            {                if (!phi[i * j])                {                    phi[i * j] = i * j;                }                phi[i * j] *= i - 1;                phi[i * j] /= i;            }        }}int main(){    get_prime();    int T;    cin >> T;    while (T--)    {        init();        solve();        outp();    }    return 0;}void solve(){}void init(){    scanf("%d", &n);}void outp(){    printf("%d\n", phi[n]);}


0 0
原创粉丝点击