zoukankan      html  css  js  c++  java
  • 方程解的个数【数论】

    题目描述

    给定一个不超过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
    ",ans);
    25   }
    26 }


  • 相关阅读:
    Mycat适合场景及不适合场景
    solr与Elasticsearch对比
    分布式搜索之搭建Solrcloud(Solr集群)
    Mysql索引最左匹配原则
    CAS实现单点登录SSO执行原理及部署
    Spring Cloud,Dubbo及HSF对比
    Dubbo支持的协议的详解
    Dubbo架构设计详解
    几种分布式锁的实现方式
    深入分析volatile的实现原理
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/8045790.html
Copyright © 2011-2022 走看看