题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1999
题目描述:
不可摸数
Time Limit: 2000 / 1000 MS (Java / Others) Memory Limit: 65536 / 32768 K (Java / Others)
Total Submission(s): 2613 Accepted Submission(s): 694
Problem Description
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
Time Limit: 2000 / 1000 MS (Java / Others) Memory Limit: 65536 / 32768 K (Java / Others)
Total Submission(s): 2613 Accepted Submission(s): 694
Problem Description
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
题目分析:
标准的筛选法。求出每个数的因子和,
然后看因子和是否在1000以内,是的话就证明等于因子和的这个数是不可摸数。
然后看因子和是否在1000以内,是的话就证明等于因子和的这个数是不可摸数。
代码如下: ( 奋斗哥代码 0rz................... )
#include
<
iostream
>
#include < string .h >
#include < cmath >
using namespace std;
int sum[ 1000001 ], sign[ 1001 ];
int main()
{
int nCases, num;
scanf( " %d " , & nCases);
for ( int i = 1 ; i <= 500000 ; ++ i)
for ( int j = 2 * i; j <= 1000000 ; j += i)
sum[j] += i;
for ( int i = 1 ; i <= 1000000 ; ++ i)
if (sum[i] < 1000 )
sign[sum[i]] = 1 ;
while (nCases -- )
{
scanf( " %d " , & num);
if (sign[num])
printf( " no\n " );
else
printf( " yes\n " );
}
return 0 ;
}
#include < string .h >
#include < cmath >
using namespace std;
int sum[ 1000001 ], sign[ 1001 ];
int main()
{
int nCases, num;
scanf( " %d " , & nCases);
for ( int i = 1 ; i <= 500000 ; ++ i)
for ( int j = 2 * i; j <= 1000000 ; j += i)
sum[j] += i;
for ( int i = 1 ; i <= 1000000 ; ++ i)
if (sum[i] < 1000 )
sign[sum[i]] = 1 ;
while (nCases -- )
{
scanf( " %d " , & num);
if (sign[num])
printf( " no\n " );
else
printf( " yes\n " );
}
return 0 ;
}