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 8Sample Output
yes yes no
题解:大数求因子一般都用打表法,节省时间。
memset(F,0,sizeof(F));
for(int i=1; i <=N/2 ; i++)
for(int j=i+i;j<=N; j+=i)
F[j]+=i;
代码如下:易错点:数组一定要开的足够大
#include<stdio.h>
#include<string.h>
#define N 500000
int F[N+1];
int main()
{
memset(F,0,sizeof(F));
for(int i=1; i <=N/2 ; i++)
for(int j=i+i;j<=N; j+=i)
F[j]+=i;
int t;
scanf("%d",&t);
while(t--)
{
int n,flag=0;
scanf("%d",&n);
for(int i = 1; i <= N; i++)
{
if(F[i]==n && i!=n)
{
flag=1;
break;
}
}
if(flag==1)
printf("no\n");
else
printf("yes\n");
}
return 0;
}