zoukankan      html  css  js  c++  java
  • 2019牛客暑期多校训练营(第一场) B Integration(裂项解方程+找规律)

    链接:https://ac.nowcoder.com/acm/contest/881/B
    来源:牛客网

    题目大意:有$frac{1}{pi }int_{0}^{infty }frac{1}{1^{2}+x^{2}}dx=frac{pi }{2}$,给一个序列$a_{1},a_{2},...,a_{n}$,让你求$frac{1}{pi }int_{0}^{infty }frac{1}{prod_{i=1}^{n}{a_{i}}^{2}+x^{2}}dx$的解mod($10^{9}+7$)。

    解法:

      1. 当n=1时,该方程为$frac{1}{pi }int_{0}^{infty }frac{1}{a^{2}+x^{2}}dx$

        有不定积分$frac{1}{a^{2}+x^{2}}$=$frac{1}{a}arctanfrac{x}{a}+C$

        当$x ightarrow infty $时,$frac{1}{a}arctanfrac{x}{a}=frac{pi }{2a}$

        所以n=1时,答案为$frac{1}{2a}$

      2. 当n=2时,设$a_{1}$为a,$a_{2}$为b。

        该方程为$frac{1}{pi }int_{0}^{infty }frac{1}{(a^{2}+x^{2})(b^{2}+x^{2})}dx$

        由于不定积分里面的分式乘积的形式,那么可以采用拆项积分法,可将方程表示成$frac{1}{pi }int_{0}^{infty }(frac{alpha }{a^{2}+x^{2}}+frac{eta }{b^{2}+x^{2}})dx$

        通分,方程为$frac{1}{pi }int_{0}^{infty }frac{(alpha b^{2}+eta a^{2})+(alpha+eta)x^{2}}{(a^{2}+x^{2})(b^{2}+x^{2})}dx$

        得到两个方程两个未知数$left{egin{matrix}
    alpha b^{2}+eta a^{2}=1\
    alpha+eta=0
    end{matrix} ight.$

        解得$left{egin{matrix}
    alpha =frac{1}{b^{2}-a^{2}}\
    eta=frac{1}{a^{2}-b^{2}}
    end{matrix} ight.$

        原方程可化为$frac{1}{pi }[frac{1}{b^{2}-a^{2}}int_{0}^{infty }frac{1}{(a^{2}+x^{2})}dx+frac{1}{a^{2}-b^{2}}int_{0}^{infty }frac{1}{(b^{2}+x^{2})}dx]$

        所以n=2时,答案为$frac{1}{(b^{2}-a^{2})}frac{1}{2a}+frac{1}{(a^{2}-b^{2})}frac{1}{2b}$

      3. 当n=3时,设$a_{1}$为a,$a_{2}$为b,$a_{3}$为c。

          同样使用拆项积分法,可将该方程表示成$frac{1}{pi }int_{0}^{infty }(frac{alpha }{a^{2}+x^{2}}+frac{eta }{b^{2}+x^{2}}+frac{gamma }{c^{2}+x^{2}})dx$

       通分后,$frac{1}{pi }int_{0}^{infty }frac{(alpha b^{2}c^{2}+eta a^{2}c^{2}+gamma
    a^{2}b^{2})+(alpha b^{2}+alpha c^{2}+eta a^{2}+eta c^{2}+gamma a^{2}+gamma b^{2})x^{2}+(alpha+eta+gamma)x^{4}}{(a^{2}+x^{2})(b^{2}+x^{2})(c^{2}+x^{2})}dx$

          可得三个方程,$left{egin{matrix}
    alpha b^{2}c^{2}+eta a^{2}c^{2}+gamma
    a^{2}b^{2}=1\alpha b^{2}+alpha c^{2}+eta a^{2}+eta c^{2}+gamma a^{2}+gamma b^{2}=0
    \alpha+eta+gamma=0
    end{matrix} ight.$

        解得$left{egin{matrix}
    alpha=frac{1}{(b^{2}-a^{2})(c^{2}-a^{2})}\
    eta=frac{1}{(a^{2}-b^{2})(c^{2}-b^{2})}\
    gamma=frac{1}{(a^{2}-c^{2})(b^{2}-c^{2})}
    end{matrix} ight.$

        所以n=3时,答案为$frac{1}{(b^{2}-a^{2})(c^{2}-a^{2})}frac{1}{2a}+frac{1}{(a^{2}-b^{2})(c^{2}-b^{2})}frac{1}{2b}+frac{1}{(a^{2}-c^{2})(b^{2}-c^{2})}frac{1}{2c}$

        对比n=1,n=2,n=3,可以发现该方程的解为$sum_{i=1}^{n}frac{1}{2a_{i}}prod_{j!=i}frac{1}{a_{j}^{2}-a_{i}^{2}}$

    于是我们便可以在O($n^{2}$)的算出结果

    AC代码:

     语言:C++ 代码长度:1316 运行时间: 338 ms 占用内存:1376K 

     1 #include<bits/stdc++.h>
     2 #define numm ch-48
     3 #define pd putchar(' ')
     4 #define pn putchar('
    ')
     5 #define pb push_back
     6 #define fi first
     7 #define se second
     8 #define fre1 freopen("1.txt","r",stdin)
     9 #define fre2 freopen("2.txt","w",stdout)
    10 using namespace std;
    11 template <typename T>
    12 void read(T &res) {
    13     bool flag=false;char ch;
    14     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
    15     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);
    16     flag&&(res=-res);
    17 }
    18 template <typename T>
    19 void write(T x) {
    20     if(x<0) putchar('-'),x=-x;
    21     if(x>9) write(x/10);
    22     putchar(x%10+'0');
    23 }
    24 typedef long long ll;
    25 const int maxn=1e3+10;
    26 const ll mod=1e9+7;
    27 ll a[maxn];
    28 ll quickpow(ll a,ll b,ll mod) {
    29     ll ans=1;
    30     while(b) {
    31         if(b&1) ans=(ans*a)%mod;
    32         a=(a*a)%mod;
    33         b>>=1;
    34     }
    35     return ans;
    36 }
    37 int main()
    38 {
    39     int n,m,k;
    40     while(scanf("%d",&n)!=EOF) {
    41         for(int i=1;i<=n;i++)
    42             read(a[i]);
    43         ll sum=0;
    44         for(int i=1;i<=n;i++) {
    45             ll temp=1;
    46             for(int j=1;j<=n;j++) {
    47                 if(i==j) continue;
    48                 temp=(temp*(a[j]*a[j]%mod-a[i]*a[i]%mod+mod)%mod)%mod;
    49             }
    50             temp=temp*2%mod*a[i]%mod;
    51             sum=(sum+quickpow(temp,mod-2,mod)%mod)%mod;
    52         }
    53         write(sum);pn;
    54     }
    55     return 0;
    56 }
    代码在这里!
  • 相关阅读:
    简介支持向量机热门(认识SVM三位置)
    马云控股“中国文化”什么暗藏玄机?
    cocos2d-x 颜色
    饼干怪兽和APT攻击
    FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因
    java传值和通过引用传递
    威佐夫博奕
    数据复制特定的代码:监视剪贴板和剪贴板内容到治疗后的剪贴板
    Opencv on Ubuntu (from Ubuntu)
    Hdu 4916 Count on the path
  • 原文地址:https://www.cnblogs.com/wuliking/p/11238794.html
Copyright © 2011-2022 走看看