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

浙公网安备 33010602011771号