HNUST OJ 1746 方程解的个数

46 篇文章 23 订阅

问题 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
****************************************************************/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值