Haoren is very good at solving mathematic problems. Today he is working a problem like this:
  Find three positive integers X, Y and Z (X < Y, Z > 1) that holds
   X^Z + Y^Z + XYZ = K
  where K is another given integer.
  Here the operator “^” means power, e.g., 2^3 = 2 * 2 * 2.
  Finding a solution is quite easy to Haoren. Now he wants to challenge more: What’s the total number of different solutions?
  Surprisingly, he is unable to solve this one. It seems that it’s really a very hard mathematic problem.
  Now, it’s your turn.

Input
  There are multiple test cases.
  For each case, there is only one integer K (0 < K < 2^31) in a line.
  K = 0 implies the end of input.
  

Output
  Output the total number of solutions in a line for each test case.

Sample Input
9
53
6
0

Sample Output
1
1
0
  
Hint

9 = 1^2 + 2^2 + 1 * 2 * 2

53 = 2^3 + 3^3 + 2 * 3 * 3

解题思路:我相信大家刚看到本题时,都会想到暴力,但又看了看会觉得暴力超时呀!的确,本题直接用暴力会超时,但是,我们不妨换一种思路,当z=2时,x^z + y^z +x*y*z=(x+y)^2=k,即x+y=sqrt(k),那么只需要在1~2^16范围内来判断,并且这里拥有一个小规律,组合数ant = (sqrt(k) - 1)/2(这个仅在sqrt(k)是整数时成立,非整数时无解);

那么接下来只需要判断z>=3&&z<=31时的情况了,根据化简此时x<y<=1124(这里只要大于1024即可),于是直接暴力,但是别忘了剪枝,否则依旧会超时。

代码如下:

#include <iostream>
#include <cstdio>
#include <cmath>using namespace std;long long Pow(int x,int n)//本题需要自己编写pow函数,调用系统函数会超时。
{long long ans = 1;for(int i=1;i<=n;i++)ans *= x;return ans;
}int main()
{long long k;int x,y,z;while(scanf("%lld",&k)!=EOF && k){long long ant = 0;int a = (int)sqrt(k);if(a*a*1.0 == k)//进行z=2的判断ant+=(a-1)/2;for(z=3;z<=31;z++)//对z>=3的情况进行暴力求解。{for(x=1;x<=1100;x++){if(Pow(x,z) >= k)       break;//剪枝for(y=x+1;y<=1100;y++){long long ans = Pow(x,z)+Pow(y,z) + x*y*z;if(ans == k){ant++;break;}else if(ans > k || ans < 0)   break;//剪枝}}}printf("%lld\n",ant);}return 0;
}

杭电acm 4282 A very hard mathematic problem相关推荐

  1. 杭电acm第2304题答案c语言,【转】杭电ACM试题分类

    注:网上搜的 第一篇 1001 这个就不用说了吧 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 ...

  2. 【杭电ACM】1097 A hard puzzle

    [杭电ACM]1097  A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid=1097 先用int手写了算法结果竟然wrong answer ...

  3. 杭电ACM刷题(1):1002,A + B Problem II

    最近忙于考试复习,没有多少可供自己安排的时间,所以我利用复习之余的空闲时间去刷刷杭电acm的题目,也当对自己编程能力的锻炼吧. Problem Description I have a very si ...

  4. 杭电acm2151题java的解法,杭电ACM题型分类

    杭电ACM题型分类 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.1032.1037.1040.1048.1 ...

  5. 杭电acm a+b问题

    杭电acm 1000 a+b问题代码 int main() { int a,b; for(;~scanf("%d%d",&a,&b);printf("%d ...

  6. 杭电ACM 1174

    //身高,又称身长,是指一个人从头顶到脚底的身体长度. //杭电ACM 1174 爆头 #include<iostream> #include<cmath> using nam ...

  7. 杭电ACM(HDUOJ)试题分类

    杭电ACM试题分类 第一篇 1001 这个就不用说了吧                      1002 简单的大数                            1003 DP经典问题,最 ...

  8. 杭电ACM题目类型整理

    版权声明:(╯3╰) 转载请注明: http://blog.csdn.net/bat67 杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 10 ...

  9. 杭电acm 2022

    海选女主角 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  10. 杭电acm的第1000题c语言解法

    首先我选择的是c语言的解法,开始是输入如下的答案: #include "stdio.h" int main(void) { long long a,b; scanf("% ...

最新文章

  1. (转) MiniUI使用
  2. Ultrahaptics公司为Holodeck型触觉关闭了2300万美元的资金回合
  3. PAT甲级题目翻译+答案 AcWing(图论)
  4. 如何阻止ajax自动重定向_重发和重定向有什么区别与重定向应用
  5. 小型的网站服务器配置,中小型网站服务器配置参考
  6. 点击一次铵钮产生一个新文本框,分别输入值,然后获取
  7. lucene 入门整理
  8. 视图机制对于数据库的安全意义
  9. linux终端 打开光驱,ubuntu如何挂载光盘? Ubuntu下中手动挂载光盘的教程
  10. 简单计算器 -python
  11. Nexus下载安装及对接
  12. echarts地图设置label引导线
  13. 用python计算内部收益率
  14. 和威金作者的聊天记录 (附:VIKING专杀及杀毒思路)
  15. flutter TextField删除文字后光标跑到文字末尾
  16. 躲避地震,不要钻入桌子下方
  17. 8月1号起 银行卡、支付宝、微信的这些费用可以省了!
  18. 学习路之html--扒取整站网页----扒站神器(Mac版跟window版)
  19. linux构建widi显示服务,如此简单 Intel WiDi无线高清设置教程
  20. 汽车电子系统网络安全指南与汽车信息物理融合系统网络安全指南

热门文章

  1. 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
  2. ARM 汇编语言教程
  3. 微信小程序动画效果集合
  4. 关于STM32、温度传感器论文的参考文献
  5. 微型计算机控制技术赖寿宏版课后答案,微型计算机控制技术答案(赖寿宏)
  6. 信息论与编码冯桂周林著答案_信息论与编码(信息与通信工程高等学校电子信息类专业系列教材)...
  7. 国科大2018级信息论考试复习
  8. Fbinst增强版 命令详解
  9. 猎豹网校java版算法_猎豹网校JAVA语言数据结构与算法视频教程 Java语言
  10. 黑客帝国,社会化网络