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 }
代码在这里!
原文地址:https://www.cnblogs.com/wuliking/p/11238794.html