程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> hdu4282A very hard mathematic problem 暴力枚舉

hdu4282A very hard mathematic problem 暴力枚舉

編輯:關於C++
//給出k
//找x,y,z使得x^z+y^z+x*y*z = k
//x,y,z都為正整數x1問有多少種方法
//當z = 2時,可以看到左邊是一個完全平方
//而當z>=3時,可以暴力枚舉x,y
//由於k<2^31所以x<2^(31/3)枚舉復雜度可以過
#include
#include
#include
#include
using namespace std ;
const int maxn = 100 ;
const int inf = 0x7fffffff ;
typedef __int64 ll;
ll pow(ll a , ll b)
{
    ll c = 1;
    while(b)
    {
        if(b&1)c*=a;
        if(c > inf)return -1 ;
        b >>= 1;
        a *= a ;
    }
    return c ;
}
int main()
{
    int k;
    while(scanf(%d ,&k) && k)
    {
        int ans = 0 ;
        int t = (int)sqrt((double)k) ;
        if(t*t == (double)k)
        ans += (int)(t-1)/2 ;
        for(ll i = 1;i*i*i < k ;i++)
           for(ll j = i + 1;j*j*j< k;j++)
             for(ll s = 3;;s++)
             {
                 ll t1 = pow(i,s) ;ll t2 = pow(j , s) ;
                 if(t1 == -1 || t2 == -1)
                 break;
                 if(t1 + t2 + i*j*s ==k)
                 ans++ ;
                 if(t1 + t2+ i*j*s > k)
                 break;
             }
        printf(%d
 ,ans) ;
    }
    return  0 ;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved