链接: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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }