title: 不可摸数
tags: [acm,杭电]
categories: acm
题意
如果是不可摸数就输出yes,如果是可摸数就输出no,题目中的测试数据8是一个可摸数,输出no,因为10的真因子之和是1+2+5=8所以8是可摸数。
分析
题意是给出一个数n判断有没有任何一个数m,m的真因子之和是n的,如果有输出no没有输出yes假设m的真因子之和是s(m),如果s(m)=1000,那么m的值有可能比1000大得多,如果要求得所有的数的真因子之和,把这些真因子之和保存下来,输入n,然后判断n是否在这这些真因子之和中。因为题目给的范围是2到1000,一个数的真因子之和是一千,而这个数是非常大的。
代码
#include <stdio.h>
int M= 500050;
int moshu[1010];
long long int a[500050];//为什么这么大,因为500050以内的数的真因子之和才包括1000
void qiumoShu()//打表
{
int i,j,m;
m = M/2;
for (i=1; i<=m; ++i)//仔细看,这种方法类似于筛选法求素数
for (j=i+i; j<M; j+=i)
a[j] += i;
for (i=0; i<M; i++)
if (a[i]<=1000)
moshu[a[i]] = 1;//把真因子之和小于1000的标记下来
}
int main ()
{
int a, i, N;
scanf ("%d", &N);
qiumoShu();
while (N --)
{
scanf ("%d", &a);
if (moshu[a])//如果有一个数的真因子之和==a;
printf ("no
");
else
printf ("yes
");
}
return 0;
}