Croc Champ 2013 - Round 2 (Div. 2 Edition) E. Cube Problem 解题报告

很郁闷的一题,完全在考数学的不等式

题目简化后的公式为 a^3+b^3+c^3+n=(a+b+c)^3,对其进行化简,

最后的等式为 (a+b)(a+c)(b+c)=n/3

假设 a<=b<=c,(注意求得a,b,c后对其进行排列,原本的a,b,c是没有顺序的)

则 (a+b)<=(a+c)<=(b+c)

三个数相乘必然有个数小于等于 开n/3的立方,有一个数大于等于开n/3的立方

如  xy=n ,则 x <=  √n  ,y>= √n

设 i=(a+b) , j = (a+c), k =(b+c),则 i<=j<=k

令 n=n/3

枚举 i=2....sqrt(n)

  则 j*k= n/i (注意要保证n/i是整数) (注意 j >= i)

  令m=n/i

  两个数相乘必然有个数小于等于 √m,有个数大于等于 √m

  则枚举 j = i..sqrt(m) (如果直接将j从i开始枚举会超时)

    则 k= m/j (同样要保证m/j是整数)

      a+b = i

      a+c=j

      b+c=k

    则 a = (i+j-k)/2, b=(i+k-j)/2 ,c=(j+k-i)/2   由于 a>0 注意 i+j > k  同时 (i+j-k)/2,(i+k-j)/2,(j+k-i)/2都要是整数

     a,b,c求出后对其排列计算其数目就行

 

 

#include 
#include 
#include 
#include 

using namespace std;

typedef long long LL;

int main(){
    LL n;
    cin >> n;
    if( n%3 != 0){
        cout<<0< k){
                if(i==j && j==k) ans +=1;
                else{
                    if( (i+j-k)%2 || (i+k-j)%2 || (j+k-i)%2 ) continue;
                    else{
                        int a = (i+j-k)/2,b=(i+k-j)/2,c=(j+k-i)/2;
                        if(a == b && b == c) ans+=1;
                        if(a < b && b < c) ans+=6;
                        if( a== b && b < c) ans +=3;
                        if( a < b && b ==c ) ans +=3;
                    }
                }
            }
        }
    }
    cout<

  

    

转载于:https://www.cnblogs.com/xiongqiangcs/archive/2013/04/24/3040558.html

你可能感兴趣的:(Croc Champ 2013 - Round 2 (Div. 2 Edition) E. Cube Problem 解题报告)