方程解的个数【数论】

题目描述

给定一个不超过10000的正整数n,问等式ac^2+ad^3+6*a*b*d=2bc^2+2bd^3+3a^2 有多少组不同的解?其中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)(d^3+c^2)=3ad(a-2b),即式子成立的条件为:1.a=2b 2.a≠2b&&d^3+c^2==3ad
  这个分类方式太重要了!分成两类,不重不漏!第一类a=2b时答案显然有n*n*n/2,因为此时b可以取遍n内所有能保证2*b<=n的数,即可以取n/2个数,此时c、d任选。第二类就需要枚举判断d^3+c^2==3ad,对于每一对前式成立的d、c、a,b都可以有n中取法,而当a为偶数时,
在第一类中已经算过一回a=2b了,所以要减掉这一个答案!
参考代码:(多谢博主,来源:http://blog.csdn.net/deaidai/article/details/72940291
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstdio>
 5 using namespace std;
 6 typedef long long ll;
 7 int main()
 8 {
 9   ll n, ans;
10   while(scanf("%lld",&n)!=EOF){
11     ll a, c, d;
12     ans = n / 2;
13     ans *= n * n;
14     for(a = 1; a <= n; a++)
15     for(d = 1; d * d < 3 * a; d++){
16         ll cc = 3 * a * d - d * d * d;
17         c = sqrt(cc);
18         if(c>=1 && c <= n && cc==c*c){
19             ans += n;
20             if(a % 2 == 0)
21                 ans--;
22         }
23     }
24     printf("%lld\n",ans);
25   }
26 }

 



posted @ 2017-12-16 09:13  ╰追憶似水年華ぃ╮  阅读(395)  评论(0编辑  收藏  举报