HDU 4282 A very hard mathematic problem --枚举+二分(或不加)

题意:问方程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 __int64
using namespace std;
#define N 200007

lll 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;
}

时间: 2024-08-27 18:53:45

HDU 4282 A very hard mathematic problem --枚举+二分(或不加)的相关文章

hdu 4282 A very hard mathematic problem(二分)

A very hard mathematic problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3990    Accepted Submission(s): 1170 Problem Description Haoren is very good at solving mathematic problems. Today

hdu 4282 A very hard mathematic problem

A very hard mathematic problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5697    Accepted Submission(s): 1594 Problem Description Haoren is very good at solving mathematic problems. Today

!HDU 4282 A very hard mathematic problem-卡时间-(二分枚举)

题意:x^z+y^z+xyz=k,给定k求出满足该式子的x,y有多少种.(x<y,z>1,k<2^31) 分析: 一看就是卡时间的题,这种题一般方法是枚举,但是要先分析一下数据的关系,把枚举的变量的数据范围缩小到可接受的程度:另外二分在这种题里是常用的方法. 本题要复杂一点,有三个变量都要枚举.首先z作为幂,而k<2^31,所以z不可能超过31:其次考虑z取最小值2的情况,此时有(x+y)^2=k,估算得x+y<=10^4.5,也就是x+y不超过40000,这就把x和y的范围

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

hdu 4403 A very hard Aoshu problem

hdu 4403 A very hard Aoshu problem 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4403 DFS 这几天集训,一天也就写个4题,被虐哭QAQ.回寝室后游少说解搜索就大胆搜,最后剪个枝就好了Orz,然后我就尝试解这题(剪枝要风骚).我先枚举等号的位置equ,然后搜索加号add的位置,然后主要的剪枝:如果等号左边运算后小于等号右边各个位上的数的和,那么后面的肯定不满足条件,右边同理.最后要小心爆int,这里吃了很多W

hdu 4430 Yukari&#39;s Birthday 枚举+二分

注意会超long long 开i次根号方法,te=(ll)pow(n,1.0/i); Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3262    Accepted Submission(s): 695 Problem Description Today is Yukari's n-th birt

hdu 4968 Improving the GPA(暴力枚举)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970 Problem Description Xueba: Using the 4-Point Scale, my GPA is 4.0. In fact, the AVERAGE SCORE of Xueba is calculated by the following formula: AVERAGE SCORE = ∑(Wi * SCOREi) / ∑(Wi) 1<=i<=N where S

HDU 5024 Wang Xifeng&#39;s Little Plot (枚举 + DFS记忆化搜索)

Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 513    Accepted Submission(s): 338 Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>)