杭电oj P1999 不可摸数
题目
#include <iostream>
#include <math.h>
using namespace std;
int a[1000000];
int main()
{
int t, n;
cin >> t;
for(int i = 1; i <= 1000000; i++)
{
for(int j = i * 2; j <= 1000000; j+=i)
a[j] += i;
}
for(int i = 1; i <= t; i++)
{
cin >> n;
for(int j = 2; j <= 1000000; j++)
{
if(a[j] == n)
{
cout << "no" << endl;
break;
}
else if(j == 1000000)
cout << "yes" << endl;
}
}
return 0;
}
for(int i = 1; i <= 1000000; i++)
{
for(int j = i * 2; j <= 1000000; j+=i)
a[j] += i;
}
代码来源
代码思路:第一个循环是把每个因数i加到从1 ~ 10000000的数组(例如i = 3, 把i加到因数有3的数j中)注意第二个循环是j+=i
for(int i = 2; i <= 1000000; i++)
{
int sum = 1;
for(int j = 2; j < sqrt(i); j++)
{
if(i % j == 0)
{
sum += j;
sum += i / j;
}
}
a[i] = sum;
}
原本的代码,数组必须开到1000000,少一个0都不行,但这样写循环时间超限。