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 <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

typedef long long LL;

int main(){
    LL n;
    cin >> n;
    if( n%3 != 0){
        cout<<0<<endl;
        return 0;
    }
    n /= 3;
    int ans = 0;
    for(LL i = 2; i*i*i <= n ; i ++ ){
        if( n%i ) continue;
        LL m = n/i;
        for(LL j = max(i,(LL)(-i+sqrt(i*i+4*m))/2); j*j  <= m; j ++){
            if( m%j ) continue;
            LL k=m/j;
            if((i+j) > 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<<ans<<endl;
    return 0;
}

  

    

原文地址:https://www.cnblogs.com/xiongqiangcs/p/3040558.html