HDU 4282 A very hard mathematic problem --枚举+二分(或不加)
来源:互联网 发布:mac apache forbidden 编辑:程序博客网 时间:2024/04/29 10:39
题意:问方程X^Z + Y^Z + XYZ = K (X<Y,Z>1)有多少个正整数解 (K<2^31)
解法:看K不大,而且不难看出 Z<=30, X<=sqrt(K), 可以枚举X和Z,然后二分找Y,这样的话不把pow函数用数组存起来的话好像会T,可以先预处理出1~47000的2~30次幂,这样就不会T了。
但是还可以简化,当Z=2时,X^2+Y^2+2XY = (X+Y)^2 = K, 可以特判下Z= 2的情况,即判断K是否为平方数,然后Z就可以从3开始了,这样的话X^3+... = K的话,X就变为大概1000多了,大大减小了枚举的复杂度,这样的话,直接爆都不会T了,也可以二分,幂函数直接暴力都没事了。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#define lll __int64using namespace std;#define N 200007lll k;int main(){ lll x,y,z; while(scanf("%I64d",&k)!=EOF && k) { lll kk = (lll)sqrt(1.0*k); lll cnt = 0; if(kk*kk == k) cnt += (kk-1LL)/2LL; lll gen = 2000LL; for(z=3;z<=30;z++) { for(x=1;x<=gen;x++) { lll xz = x; for(ll f=1;f<z;f++) { xz = xz*x; if(xz > k) { xz = k+1LL; break; } } if(xz > k) break; lll low = x+1LL; lll high = gen; while(low<=high) { y = (low+high)/2LL; lll yz = y; for(ll f=1;f<z;f++) { yz = yz*y; if(yz > k) { yz = k+1LL; break; } } if(xz+yz+x*y*z == k) { cnt++; break; } else if(xz+yz+x*y*z > k) high = y-1LL; else low = y+1LL; } } } cout<<cnt<<endl; } return 0;}
0 0
- HDU 4282 A very hard mathematic problem --枚举+二分(或不加)
- hdu 4282 A very hard mathematic problem(二分+枚举)
- hdu 4282A very hard mathematic problem(枚举+二分)
- HDU-4282 A very hard mathematic problem 技巧枚举+二分
- HDU 4282 A very hard mathematic problem 二分
- HDU 4282 A very hard mathematic problem [剪枝/二分]
- hdu 4282 A very hard mathematic problem(二分)
- hdu 4282 A very hard mathematic problem(二分)
- HDU 4282A very hard mathematic problem(二分)
- !HDU 4282 A very hard mathematic problem-卡时间-(二分枚举)
- hdu 4282 A very hard mathematic problem
- Hdu 4282 A very hard mathematic problem
- hdu 4282 A very hard mathematic problem
- hdu 4282 A very hard mathematic problem
- HDU 4282 A very hard mathematic problem
- hdu 4282 A very hard mathematic problem
- HDU 4282 A very hard mathematic problem
- hdu 4282 A very hard mathematic problem
- HDU 4941 Magical Forest --STL Map应用
- POJ 1990 MooFest --树状数组
- POJ 2464 Brownie Points II --树状数组
- POJ 3416 Crossing --离线+树状数组
- HDU 4286 Data Handler --双端队列
- HDU 4282 A very hard mathematic problem --枚举+二分(或不加)
- 一些整数类型的表示范围
- android.os.BadParcelableException: ClassNotFoundException when unmarshalling
- HDU 4793 Collision --解方程
- HDU 4454 Stealing a Cake --枚举
- HDU 4455 Substrings --递推+树状数组优化
- HDU 4460 Friend Chains --BFS
- HDU 5101 Select --离散化+树状数组
- HDU 4409 Family Name List --乱搞、LCA