参考博客https://www.cnblogs.com/dongsheng/archive/2012/08/18/2645594.html
Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
数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
-------AC---------
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 //这里MAXN开差不多1005过不了 7 #define MAXN 500010 8 9 int flag[1005],sum[MAXN]; 10 //打表 11 void init() 12 { 13 memset(flag,0,sizeof(flag)); 14 memset(sum,0,sizeof(sum)); 15 16 /*手动模拟一下就行 17 i=1; 18 sum[2]=1,sum[3]=1,sum[4]=1... 19 i=2; 20 sum[4]=1+2,sum[6]=1+2,sum[8]=1+2... 21 因为此题因子不包含自身 22 从第j=i*2算起,递增i,每个j都包含因子i 23 */ 24 25 int i,j; 26 for(i=1;i<=MAXN/2;++i) 27 for(j=i*2;j<MAXN;j+=i) 28 sum[j]+=i; 29 for(i=1;i<MAXN;++i) 30 if(sum[i]<1002) 31 flag[sum[i]]=1; 32 } 33 34 int main() 35 { 36 init(); 37 int T; 38 while(cin>>T) 39 { 40 while(T--) 41 { 42 int n; 43 cin>>n; 44 if(flag[n]) 45 cout<<"no"<<endl; 46 else 47 cout<<"yes"<<endl; 48 } 49 } 50 return 0; 51 }