HDU.1999(不可摸数)
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
Input
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。
Output
如果n是不可摸数,输出yes,否则输出no
Sample Input
3 2 5 8
Sample Output
yes yes no
解题思路:因为素数的s(n)是1,所以当一个数是一个素数的平方时,他的s(n)最小,而1000内最大的素数是997,997的平方是将近100万,如果一次一次算每个数的s(n)会导致时间超限,所以这里改进代码如下
#include <iostream>
using namespace std;
const int N =1000010;
int num[1010],sum[N]; //num用来记录(打表记录1000内的不可摸数),sum用来记录每个数的s(n)
void dabiao()
{
int s = N/2;
for(int i = 1;i < s;i++)
{
for(int j = 2*i;j < N;j+=i)//此处是重点“此处是计算每个数的s(n)”
{
sum[j] += i;
}
}
for(int i = 0;i < N;i++){
if(sum[i] < 1000) num[sum[i]] = 1;// 由上面得到的给num数组打表
}
}
int main()
{
int n,judge;
cin >> n;
dabiao();
while(n--){
cin>>judge;
if(num[judge] == 0)cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}