题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1337
解题报告:虽然x和y的范围都是10^8,但是如果a 是大于1000的话,那么a^3就会大于10^9,这样等号的右边只有一个10 * c + 3,这个最大只能达到10^9数量级,所以,不管输入的x跟y是多少,我们只要取其中的在1到1000的区间就可以了,枚举a和b,那么c就可以得到,然后判断c的范围是不是在x到y之间,这样时间复杂度就降到了10^6.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdlib> 6 using namespace std; 7 typedef long long INT; 8 INT th[1005]; 9 void dabiao() 10 { 11 for(INT i = 1;i <= 1000;++i) 12 th[i] = i * i * i; 13 } 14 int main() 15 { 16 dabiao(); 17 INT x,y; 18 int kase = 1; 19 while(scanf("%lld%lld",&x,&y)!=EOF) 20 { 21 INT ans = 0; 22 INT a = min(x,(INT)1000); //不存在大于1000的 23 INT b = min(y,(INT)1000); 24 for(INT i = a;i <= b;++i) 25 for(INT j = a;j <= b;++j) 26 { 27 INT s = th[i] + th[j]; 28 if(s % 10 == 3 && s / 10 <= y) 29 ans++; 30 } 31 printf("Case %d: %lld\n",kase++,ans); 32 } 33 return 0; 34 }