(筛子法)hdu1286 & hdu1999

hdu1286找新朋友

开始做时用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; }

 

 

                  hdu1999(不可摸数)

Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
Input
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。
 
Output
如果n是不可摸数,输出yes,否则输出no
 
Sample Input
3
2
5
8
 
Sample Output
yes
yes
no

 

 #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; }

你可能感兴趣的:(编程,测试,ini,input,output)