不可摸数

题目连接

题意

如果是不可摸数就输出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\n");
        else
            printf ("yes\n");

    }
    return 0;
}



posted @ 2017-04-14 19:17  -梦里不知身是客  阅读(211)  评论(0编辑  收藏  举报