http://codeforces.com/contest/460/problem/B
注意到1到1000000000范围内s(x)最大的数是999999999 最大值81。因此可以在1到81进行枚举,在检查x是否满足条件即可。
1.快速幂取模运算
typedef long long ll;
const ll mod = 1000000000000000ll;
ll Pow(int a, int b){
int res = 1;
a = a % mod;
while(b){
if(b & 1)
res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
2.求解s(x)
int s(long long x){
int sum = 0;
while(x){
sum += x % 10;
x /= 10;
}
return sum;
}
AC_code:
#include <map>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod = 1000000000000000ll;
long long tmp[110];
ll Pow(int a, int b){
int res = 1;
a = a % mod;
while(b){
if(b & 1)
res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int s(long long x){
int sum = 0;
while(x){
sum += x % 10;
x /= 10;
}
return sum;
}
int main(){
// freopen("in.txt", "r", stdin);
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
int ans = 0, k = 0;
for(int i=1; i<=81; i++){
ll f = b * Pow(i, a) + c;
if(s(f) == i && f < 1000000000){
ans++;
tmp[k++] = f;
}
}
printf("%d\n",ans);
int flag = 1;
for(int i=0; i<k; i++){
if(flag != 1) printf(" ");
printf("%d",tmp[i]);
flag++;
}
printf("\n");
return 0;
}