hdu 1999 不可摸数(筛法求数n的真因子之和)

来源:互联网 发布:js设置div不可见 编辑:程序博客网 时间:2024/05/16 12:23
题目地址
题目大意:s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数,判断一个1000以内的数是否为不可摸数
解题思路:要判断一个数n是否为不可摸数,定要确定是否完全没有一个正整数m的真因子之和,那就得将1000以内的真因子之和找出来,求真因子之和用筛法
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <queue>#include <string>using namespace std;const int maxn = 1000000+10;const int maxm = 1000+10;int sum[maxn],sign[maxm];int main(){    memset(sum,0,sizeof(sum));    memset(sign,0,sizeof(sign));    for(int i = 1; i <= 500000; i++)//筛法求s(n),并用数组sum存起来    {        for(int j = 2*i; j <= 1000000; j += i)        {            sum[j] += i;        }    }    for(int i = 1; i <= 1000000; i++)//标记1000以内的s(m)        if(sum[i] < 1000)            sign[sum[i]] = 1;    int t,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        if(!sign[n])            puts("yes");        else            puts("no");    }    return 0;}


0 0