方程解的个数【数论】
给定一个不超过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 }