问题 F: 方程解的个数
时间限制: 5 Sec 内存限制: 128 MB
题目描述
给定一个不超过10000的正整数n,问等式ac²+ad³+6abd=2bc²+2bd³+3a²d 有多少组不同的解?其中a,b,c,d均为整数且取值范围是区间[1,n]。若解(a1,b1,c1,d1)和解(a2,b2,c2,d2)相同,则有a1=a2,b1=b2,c1=c2,d1=d2.
输入
输入包含多组数据(不超过100组)。
每组数据一行,仅包含一个整数n。
输出
对于每一组数据的n,输出满足题意的方程解的数目。
样例输入
1
2
样例输出
0
5
思路
方程可化简为(a-2b)(c^2-3ad+d^3)=0 ,故分两种情况,左括号为0和右括号为0
左括号的规律可以轻松找出来,而右括号只能枚举求解
还有一点就是因为d有个三次方 所以d会尽量偏小,所以将c平方放一边,其余放另一边
然后就限制d的平方小于3a就好了
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long ll;
// (a-2b)(c^2-3ad+d^3)=0
int main()
{
ll n, ans;
while(~scanf("%lld",&n)){
ll a, c, d;
ans = n / 2;//有多少组a=2b的解
ans *= n * n;//a=2b后,因为cd可以任意取1~n,
for(a = 1; a <= n; a++)//对c^2-3ad+d^3=0的解枚举
for(d = 1; d * d < 3 * a; d++){//限制d范围
ll cc = 3 * a * d - d * d * d;
c = sqrt(cc);
//printf("%d %d %d\n",c,d,a);
if(c>=1 && c <= n && cc==c*c){
ans += n;
if(a % 2 == 0)//a为偶数,即减去已算过的a=2b的数
ans--;
}
}
printf("%lld\n",ans);
}
}
/**************************************************************
Problem: 1746
User: 21XXXXXXXX
Language: C++
Result: 正确
Time:817 ms
Memory:2036 kb
****************************************************************/