ACM数论解题报告集合.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ACM数论解题报告集合.doc

Hdu 4143 y^2 = n +x^2 A Simple Problem Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1650????Accepted Submission(s): 424 Problem Description For a given positive integer n, please find the smallest positive integer x that we can find an integer y such that y^2 = n +x^2. ? Input The first line is an integer T, which is the the number of cases. Then T line followed each containing an integer n (1=n = 10^9). ? Output For each integer n, please print output the x in a single line, if x does not exit , print -1 instead. #includestdio.h #includemath.h int main() { ??? int i,t,n,x,flag; ??? scanf(%d,t); ??? while(t--) ??? { ??? ??? flag=0; ??? ??? scanf(%d,n); ??? ??? i=sqrt(n); ??? ??? for(i;i=1;i--) ??? ??? { ??? ??? ??? if(n%i==0(n/i-i)%2==0n/i!=i) ??? ??? ??? { ??? ??? ??? ??? x=(n/i-i)/2; ??? ??? ??? ??? printf(%d\n,x); ??????????????? flag=1; ??? ??? ??? ??? break; ??? ??? ??? } ??? ??? ??? ??? ??? } ??? ??? if(flag==0) printf(-1\n); ??? } ??? return 0; } /*一开时超时 是百分百的事?? 不过要敢于写出超时的? (在时间还充裕的情况下) 后来一直不知道真么做。? 对于这种类型的题目要密切结合式子的特点 把2层循环变成一层 n=(x+y)*(x-y)? 让i=x-y n/i做x+y??? x=(n/i-i)/2; 然后找出各种条件限制 满足则可求出结果 由于程序有可能出现n/i=i的情况 但是题目中题意告诉我们不可能所以千万要排除这种情况 后来在这个地方也错了几次 */ 另外此题也可用欧几里得去做 hdu数论之Leftmost Digit目大意是输入N,求N^N的最高位数字。1=N=1,000,000,000 估计大家看到N的范围就没想法了。确实N的数字太大,如果想算出结果,即使不溢出也会超时。 这题我纠结了很久。在同学的提示下ac了。 题目是这样转化的。 首先用科学计数法来表示 N^N = a*10^x; 比如N = 3; 3^3 = 2.7 * 10^1; 我们要求的最右边的数字就是(int)a,即a的整数部分; OK, 然后两边同时取以10为底的对数 lg(N^N) = lg(a*10^x) ; 化简 N*lg(N) = lg(a) + x; 继续化 N*lg(N) - x = lg(a) a = 10^(N*lg(N) - x); 现在就只有x是未知的了,如果能用n来表示x的话,这题就解出来了。 又因为,x是N^N的位数。比如 N^N = 1200 == x = 3; 实际上就是 x 就是 lg(N^N) 向下取整数,表示为[lg(N^N)] ok a = 10^(N*lg(N) - [lg(N^N)]); 然后(int)a 就是答案了。 #includestdio.h #includemath.h int main() { ?int t; ?long long ans; ?double k,n; ?scanf(%d,t); ?while(t--) ?{ ? ??scanf(%lf,n); ??k=n*log10(n); ??k=k-(long long)k; ??????? ans=(long long)pow(10.0,k); ??printf(%lld\n,ans); ?} ?return 0; } 注意 最好让log中的数都是dou

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档