方程解的个数数论

Posted ╰追憶似水年華ぃ╮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方程解的个数数论相关的知识,希望对你有一定的参考价值。

题目描述

给定一个不超过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 }

 



以上是关于方程解的个数数论的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1573X问题(数论--拓展欧几里德 求解同余方程组的个数 模版题)

hihoCoder 1303 数论六·模线性方程组

bzoj3751[NOIP2014]解方程 数论

数论不定方程&&中国剩余定理

[基础数论]同余方程笔记

数论——[Violet]樱花