题目地址
题目大意:s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数,判断一个1000以内的数是否为不可摸数
解题思路:要判断一个数n是否为不可摸数,定要确定是否完全没有一个正整数m的真因子之和,那就得将1000以内的真因子之和找出来,求真因子之和用筛法
题目大意: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;
}
本文介绍了一种通过筛法计算1000以内所有正整数的真因子之和,并利用该结果来判断一个数是否为不可摸数的方法。不可摸数是指不存在任何正整数m使得m的真因子之和等于该数。
432

被折叠的 条评论
为什么被折叠?



