hdu1286 找新朋友 (欧拉函数)

来源:互联网 发布:快速出效果图软件 编辑:程序博客网 时间:2024/04/27 22:25

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1286


题解:其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友:求小于n的数中与n互质的数的个数,欧拉函数。


#include <stdio.h>  #include <string.h>  #define MAXN 32770#define MAX 32768int prime[MAXN],phi[MAXN],valid[MAXN],tot;  void getPrime()//素数筛选O(N)  {  int i,j;  memset(valid,1,sizeof(valid));  tot=0;  for(i=2;i<=MAX;++i)  {  if(valid[i])  {  tot++;  prime[tot]=i;  }  for(j=1;((j<=tot)&&(i*prime[j]<=MAXN));++j)  {  valid[i*prime[j]]=0;  if(i%prime[j]==0)  break;  }  }  }  void Euler()//欧拉筛选  {  int i,j;  getPrime();  for(i=2;i<=MAX;++i)  phi[i]=i;  phi[1]=0;  for(i=1;i<=tot;++i)  {  for(j=prime[i];j<=MAX;j+=prime[i])  phi[j]=phi[j]/prime[i]*(prime[i]-1);  }  } int main(){int test,n;Euler();scanf("%d",&test);while(test--){scanf("%d",&n);printf("%d\n",phi[n]);}return 0;}


原创粉丝点击