C. Cube Problem 数学

题目链接

题目大意:求多少组a,b,c 满足(a+b+c)^3=a^3+b^3+c^3+n

题解:将上述等式化简得 n=3(a+b)(a+c)(b+c)

#include<iostream>
#define int long long
using namespace std;
int n;
int a[1000006];
int cnt=0;
signed main(){
	scanf("%lld",&n);
	if(n%3) printf("0");
	//当n不为3的倍数的时候,不满足条件 
	else{
		int ans=0;
		n/=3;
		for(int i=2;i*i<=n;i++){
			if(n%i==0) a[++cnt]=i;//将n的因子记录下来 
		}
		//将(a+b)看作a1 将(a+c)看作a2 将(b+c)看作a3  逐个枚举  
		for(int i=1;i<=cnt&&a[i]*a[i]*a[i]<=n;i++){ 
			for(int j=i;j<=cnt&&a[j]*a[j]*a[i]<=n;j++){
				int a1=a[i]; 
				int a2=a[j];
				int a3=n/a[i]/a[j];
				if(a1*a2*a3==n&&(a1+a2-a3>0)&&(a1+a2+a3)%2==0){
					if(a1==a2&&a2==a3&&a1==a3) ans++;//当三者相等时  对答案只有一次贡献 
					else if(a1!=a2&&a2!=a3&&a1!=a3) ans+=6;//当三者都不相等时  对答案有3个值全排列共六次贡献  
					else ans+=3; //当有两个数字相同时,共产生3次贡献  
				}
			}
		}		
		printf("%lld",ans);
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值