很郁闷的一题,完全在考数学的不等式
题目简化后的公式为 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; }