K - 不可摸数

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

code:

#include<iostream>
#include<string.h>

using namespace std;
const int MAXN = 500005;
bool flag[1000];
int sum[MAXN];

int init(){
	//类似埃氏筛法 对应的把 1.2.3....的倍数要加上对应的因子 
	for(int i=1;i<MAXN/2;i++){
		for(int j=i*2;j<MAXN;j+=i){
			sum[j]+=i;	
		}
	}
	
	for(int i=1;i<MAXN;i++){
		if(sum[i]<=1000) flag[sum[i]] = true;

	}
	return 0;
}
int main(){

	memset(flag,0,sizeof(flag));
	init();
	
	int N;
	scanf("%d",&N);
	for(int i=0;i<N;i++){
		int m;
		scanf("%d",&m);
		if(flag[m]){
			printf("no\n");
		}else{
			printf("yes\n");
		}
	}	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/Willen_/article/details/87821422