首页 > 代码库 > Codeforces Round #262 (Div. 2)

Codeforces Round #262 (Div. 2)

题目链接

 

B Little Dima and Equation

题意:给a, b,c 给一个公式,s(x)为x的各个位上的数字和,求有多少个x.

分析:直接枚举x肯定超时,会发现s(x)范围只有只有1-81,所以枚举一下就行。

在做题的时候,用了pow()错了3次,很奇怪的是比完赛以后,我看cf的第一组数据竟然是错的,但是

不用pow()提交,第一组数据就是对的,不知道为什么,反正以后不太敢用pow了,还是手写吧。

昨天在b题耽误了好多时间,先是提交错第一组,然后又被人cha了。注意在x在1-10^9之间。

 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cmath> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 #define LL __int64 9 const int maxn = 1000+10;10 using namespace std;11 LL y[maxn];12 int check(LL x)13 {14     int sum = 0;15     while(x)16     {17         sum += x%10;18         x /= 10;19     }20     return sum;21 }22 LL pow_m(int a, int b)23 {24     LL ret = 1;25     for(int i = 1; i <= b; i++)26         ret *= a;27     return ret;28 }29 int main()30 {31     LL a, b, c, i;32     int cnt;33     LL tmp;34     while(~scanf("%I64d%I64d%I64d", &a, &b, &c))35     {36         cnt = 0;37         memset(y, 0, sizeof(y));38         for(i = 1; i <= 81; i++)39         {40             //tmp = (LL)pow(i, a);  //用这个我的程序跑的数据对,但是测试数据不对41             tmp = pow_m(i, a);42             tmp = (LL)tmp*b + (LL)c;43             if(check(tmp)==i)44                 {45                     if(tmp > 0 && tmp < 1000000000)46                     y[cnt++] = tmp;47                 }48         }49         sort(y, y+cnt);50         printf("%d\n", cnt);51         for(i = 0; i < cnt; i++)52         {53             if(i==cnt-1)54                 printf("%I64d\n", y[i]);55             else56                 printf("%I64d ", y[i]);57         }58     }59     return 0;60 }