开始做时用GCD~~不出意外的超时
后来上网找了一下别人的解题报告才知道怎么用(筛子法)
找新朋友 Problem 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 7680 16016
#include<iostream> const int N=32768; int main() { bool str[N]; int i,j,T,n,sum; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(str,1,n+1); for(i=2;i<=n/2;i++) { if(n%i==0&&str[i]==1) { for(j=1;j*i<n;j++) { str[j*i]=0; } } } for(sum=0,i=2;i<n;i++) { if(str[i]==1) sum++; } printf("%d/n",sum+1); } return 0; }
#include<iostream> using namespace std; int a[1000001]; bool sign[1001]; int main() { int i, j; for(i = 1; i <= 500000; ++i) { for(j = 2 * i; j <= 1000000; j += i) { a[j] += i; } } for(i = 1; i <= 1000000; ++i) { if(a[i] <= 1000) sign[a[i]] = 1; } int t,n; cin>>t; while(t--) { cin>>n; if(sign[n]==1) cout<<"no"<<endl; else cout<<"yes"<<endl; } return 0; }