找新朋友
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4276 Accepted Submission(s): 1940
Problem Description
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
Input
第一行是测试数据的组数CN(Case number,1
欧拉定理 就是求1-n-1里面与n的最大公约数为1 即互素
欧拉公式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 其中p1 p2 pn都是x的因子 所以可以变形为 :φ(x)= (p1 -1) *(p2-1).....(pn-1);
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int indx[32768];
void dabiao()
{
for(int i =1 ;i<=32767;i++)
{
indx[i] =i;
}
for(int i=2;i<=32767;i++)
{
if(i==indx[i])
{
for(int j = i;j<=32767;j+=i)
indx[j] = (indx[j]/i)*(i-1);
}
}
}
int main()
{
int ncase;
scanf("%d",&ncase);
dabiao();
while(ncase--)
{
int t;
scanf("%d",&t);
printf("%d\n",indx[t]);
}
return 0;
}