链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3174
我的做法,打表,模拟即可。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstdio> using namespace std; int a[12],ans[2020]; void sun() { for(int i=1;i<=12;i++) { a[i]=i*i; } for(int i=1;i<=2009;i++) { int a1=i%1000; int a2=i%100; for(int j=1;j<=12;j++) { if(a[j]==a1||a[j]==a2) ans[i]++; } //printf("%d\n",ans[i]); } } int main() { int t,x,y,s; sun(); scanf("%d",&t); while(t--) { s=0; scanf("%d%d",&x,&y); for(int i=x;i<=y;i++) { s+=ans[i]; } printf("%d\n",s); } return 0; }
网上看了一个办法,这个方法就不用专门去存储每一年的情况了,觉得很灵活,也写在这里。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<cstdio> #include<cstring> int main() { int a[1024],s,t,x,y,k1,k2; memset(a,0,sizeof(a)); for(int i=1;i<=12;i++) a[i*i]=1; scanf("%d",&t); while(t--) { s=0; scanf("%d%d",&x,&y); for(int i=x;i<=y;i++) { k1=i%1000; k2=i%100; if(a[k1]||a[k2]) s++; } printf("%d\n",s); } return 0; }