博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杭电ACM——6463(思维)
阅读量:4048 次
发布时间:2019-05-25

本文共 1217 字,大约阅读时间需要 4 分钟。

突破口:一个很大的数,假设是20位,其每个数字的平方的和不超过2000,因此只要将2000以内的鸽子数找出来,打表就可以。

代码如下:

#include
#include
using namespace std;long long ge[150005];long long yes[2001]//yes记录2000以内的鸽子数bool search(int x,int y,int v) //二分查找{ int m; while(x
v) y=m; else x=m+1; } return false;}int p,q;int main(){ int Qn,i,j,cnt,k,sum; ge[0]=0; memset(yes,0,sizeof(yes)); memset(no,0,sizeof(no)); p=q=0; for(i=1;i<=2000;i++) //建表,找出2000内所有鸽子数 { sum=cnt=0; //sum表示各个数字平方之和,cnt辅助 j=i; while(sum!=1) //检查是否为鸽子数,是的话最终sum为1 { sum=0; while(j>0) { int t; t=j%10; sum+=t*t; j/=10; } j=sum; cnt++; if(cnt>15) break; //避免无限循坏,当计算超过15次(足够次数)就可以结束了。 } if(sum==1) yes[p++]=i; } for(i=0;i
0) { int t; t=j%10; sum+=t*t; j/=10; } if(search(0,p,sum)) ge[k++]=i; // printf("%d\n",i); } //printf("%d\n",k); scanf("%d",&Q); while(Q--) { scanf("%d",&k); printf("%lld\n",ge[k-1]); } return 0;}

小结:数据一大,但也不是大到离谱,可以考虑打表。

转载地址:http://ofdci.baihongyu.com/

你可能感兴趣的文章
三时业
查看>>
佛教三宝-三皈依
查看>>
杂阿含经喻世间有四等马
查看>>
考研前夜涂笔
查看>>
英语复试自我介绍
查看>>
什么是熵?
查看>>
拼凑、摘抄-评李代平的软件工程第二版
查看>>
误传了数千年的几个名句
查看>>
韩复榘经典语录
查看>>
厅、部、局、司区分大小
查看>>
VS2005中使用C#编写MDI窗口根据子窗口个数控制菜单项的enabled属性
查看>>
北川邓家“刘汉小学”无一死亡奇迹背后的真相
查看>>
救灾,从来没有胜利
查看>>
.net 2.0中ConfigurationManager替代了原来的ConfigurationSettings
查看>>
Asp.net 2.0中使用Datawindow.net2.0
查看>>
常用命名法:骆驼命名法,匈牙利命名法和帕斯卡命名法
查看>>
Server.MapPath方法测试结果
查看>>
Asp.net 默认配置下,Session莫名丢失的原因及解决办法
查看>>
Datawindow.net中如何使用Calendar控件
查看>>
如何在Datawindow.net中实现让当前行选中,并且当前行以其他颜色显示
查看>>