您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1333

2010-08-07 19:38 316 查看
]/*
很简单的题目。直接模拟就好了,可是我开始就是wrong
As this observation is also true for every prime number,
Wilansky decided later that a (simple and unsophisticated)
prime number is not worth being a Smith number, so he excluded them from the definition.
看了这句话,一直没有看懂,原来这句话告诉我们素数是不符合的 晕死了
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 40005;
bool hash
;
int prime[N / 2];
int p;
inline void Prime()
{
memset(hash, false, sizeof(hash));
for(int i = 2; i < sqrt(1.0 * N); i++)
if(!hash[i])
for(int j = 2; j * i < N; j++)
hash[j * i] = true;
p = 0;
for(int i = 2; i < N; i++)
if(!hash[i])
prime[p++] = i;
}
inline int Sum(int n)
{
int sum = 0;
while(n)
{
sum += n % 10;
n /= 10;
}
return sum;
}
inline bool oula(int n, int kk)
{
int temp = n;
int sum = n;
int gf = 0;
int r;
for(int i = 0; i < p; i++)
{
if(temp % prime[i] != 0)
continue;
r = 0;
while(temp % prime[i] == 0)
{
temp /= prime[i];
r++;
}
gf += Sum(prime[i]) * r;
sum  = sum / prime[i] * (prime[i] - 1);
}
if(temp > 1)
{
sum = sum / temp * (temp - 1);
gf += Sum(temp);
}
if(sum == n - 1)
return false;
if(gf == kk)
return true;
return false;
}

int main()
{
Prime();
int n;
while( scanf("%d", &n) != EOF && n)
{
n = n + 1;
while(true)
{
if(oula(n, Sum(n)))
{
printf("%d/n", n);
break;
}
n += 1;
}
}
return 0;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: