首先发出题目链接:
链接:https://ac.nowcoder.com/acm/contest/881/B
来源:牛客网
涉及:数学,快速幂,逆元
点击这里回到2019牛客暑期多校训练营解题—目录贴
题目如下:
说明一下,符号
∏
\prod
∏是连乘的意思。
先对积分进行变形,已知
∫
0
∞
1
∏
i
=
1
n
(
a
i
2
+
x
2
)
  
d
x
=
∫
0
∞
1
(
a
1
2
+
x
2
)
(
a
2
2
+
x
2
)
.
.
.
(
a
n
2
+
x
2
)
  
d
x
\int_0^\infty \frac 1{\prod^n_{i=1}(a_i^2+x^2)} \; dx=\int_0^\infty \frac 1{(a^2_1+x^2)(a^2_2+x^2)...(a^2_n+x^2)}\;dx
∫0∞∏i=1n(ai2+x2)1dx=∫0∞(a12+x2)(a22+x2)...(an2+x2)1dx
由裂项相消的知识可知,存在一系列的值
k
1
,
k
2
,
.
.
.
,
k
n
{k_1,k_2,...,k_n}
k1,k2,...,kn,使得
1
(
a
1
2
+
x
2
)
(
a
2
2
+
x
2
)
.
.
.
(
a
n
2
+
x
2
)
=
k
1
(
a
1
2
+
x
2
)
−
k
2
(
a
2
2
+
x
2
)
−
.
.
.
−
k
n
(
a
n
2
+
x
2
)
\frac 1{(a^2_1+x^2)(a^2_2+x^2)...(a^2_n+x^2)}=\frac {k_1}{(a^2_1+x^2)}-\frac{k_2}{(a^2_2+x^2)}-...-\frac {k_n}{(a^2_n+x^2)}
(a12+x2)(a22+x2)...(an2+x2)1=(a12+x2)k1−(a22+x2)k2−...−(an2+x2)kn
为了找到 k 1 , k 2 , . . . , k n {k_1,k_2,...,k_n} k1,k2,...,kn的值,可以通过找规律得出(待定系数法也行,反正我觉得好复杂)
当n=1时: 1 ( a 1 2 + x 2 ) = 1 ( a 1 2 + x 2 ) \frac 1{(a_1^2+x^2)}=\frac 1{(a_1^2+x^2)} (a12+x2)1=(a12+x2)1
当n=2时: 1 ( a 1 2 + x 2 ) ( a 2 2 + x 2 ) = 1 ( a 2 2 − a 1 2 ) ( a 1 2 + x 2 ) + 1 ( a 1 2 − a 2 2 ) ( a 2 2 + x 2 ) \frac 1{(a_1^2+x^2)(a_2^2+x^2)}=\frac 1{(a_2^2-a_1^2)(a_1^2+x^2)}+\frac 1{(a_1^2-a_2^2)(a_2^2+x^2)} (a12+x2)(a22+x2)1=(a22−a12)(a12+x2)1+(a12−a22)(a22+x2)1
当n=3时: 1 ( a 1 2 + x 2 ) ( a 2 2 + x 2 ) ( a 3 2 + x 2 ) = 1 ( a 2 2 − a 1 2 ) ( a 3 2 − a 1 2 ) ( a 1 2 + x 2 ) + 1 ( a 1 2 − a 2 2 ) ( a 3 2 − a 2 2 ) ( a 2 2 + x 2 ) + \frac 1{(a_1^2+x^2)(a_2^2+x^2)(a_3^2+x^2)}=\frac 1{(a_2^2-a_1^2)(a_3^2-a_1^2)(a_1^2+x^2)}+\frac 1{(a_1^2-a_2^2)(a_3^2-a_2^2)(a_2^2+x^2)}+ (a12+x2)(a22+x2)(a32+x2)1=(a22−a12)(a32−a12)(a12+x2)1+(a12−a22)(a32−a22)(a22+x2)1+ 1 ( a 1 2 − a 3 2 ) ( a 2 2 − a 3 2 ) ( a 3 2 + x 2 ) \frac 1{(a_1^2-a_3^2)(a_2^2-a_3^2)(a_3^2+x^2)} (a12−a32)(a22−a32)(a32+x2)1
当n=4时: 1 ( a 1 2 + x 2 ) ( a 2 2 + x 2 ) ( a 3 2 + x 2 ) ( a 4 2 + x 2 ) = 1 ( a 2 2 − a 1 2 ) ( a 3 2 − a 1 2 ) ( a 4 2 − a 1 2 ) ( a 1 2 + x 2 ) + \frac 1{(a_1^2+x^2)(a_2^2+x^2)(a_3^2+x^2)(a_4^2+x^2)}=\frac 1{(a_2^2-a_1^2)(a_3^2-a_1^2)(a_4^2-a_1^2)(a_1^2+x^2)}+ (a12+x2)(a22+x2)(a32+x2)(a42+x2)1=(a22−a12)(a32−a12)(a42−a12)(a12+x2)1+ 1 ( a 1 2 − a 2 2 ) ( a 3 2 − a 2 2 ) ( a 4 2 − a 2 2 ) ( a 2 2 + x 2 ) + 1 ( a 1 2 − a 3 2 ) ( a 2 2 − a 3 2 ) ( a 4 2 − a 3 2 ) ( a 3 2 + x 2 ) + \frac 1{(a_1^2-a_2^2)(a_3^2-a_2^2)(a_4^2-a_2^2)(a_2^2+x^2)}+\frac 1{(a_1^2-a_3^2)(a_2^2-a_3^2)(a_4^2-a_3^2)(a_3^2+x^2)}+ (a12−a22)(a32−a22)(a42−a22)(a22+x2)1+(a12−a32)(a22−a32)(a42−a32)(a32+x2)1+ 1 ( a 1 2 − a 4 2 ) ( a 2 2 − a 4 2 ) ( a 3 2 − a 4 2 ) ( a 4 2 + x 2 ) \frac 1{(a_1^2-a_4^2)(a_2^2-a_4^2)(a_3^2-a_4^2)(a_4^2+x^2)} (a12−a42)(a22−a42)(a32−a42)(a42+x2)1
通过观察,可以得到通项
1
∏
i
=
1
n
(
a
i
2
+
x
2
)
=
∑
i
=
1
n
1
(
a
i
2
+
x
2
)
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
\frac 1{\prod^n_{i=1}(a_i^2+x^2)}=\sum^n_{i=1}\frac 1{(a_i^2+x^2)\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)}
∏i=1n(ai2+x2)1=i=1∑n(ai2+x2)∏j=1n(j!=i)(aj2−ai2)1
当然,如果想证明,完全可以用数学归纳法证明这个通项。
于是
∫
0
∞
1
∏
i
=
1
n
(
a
i
2
+
x
2
)
  
d
x
=
∫
0
∞
∑
i
=
1
n
1
(
a
i
2
+
x
2
)
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
  
d
x
=
\int_0^\infty \frac 1{\prod^n_{i=1}(a_i^2+x^2)} \;dx=\int_0^\infty \sum^n_{i=1}\frac 1{(a_i^2+x^2)\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)}\;dx=
∫0∞∏i=1n(ai2+x2)1dx=∫0∞i=1∑n(ai2+x2)∏j=1n(j!=i)(aj2−ai2)1dx=
∑
i
=
1
n
1
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
∫
0
∞
1
(
a
i
2
+
x
2
)
  
d
x
\sum_{i=1}^n \frac 1{\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)} \int_0^\infty \frac 1{(a_i^2+x^2)}\;dx
i=1∑n∏j=1n(j!=i)(aj2−ai2)1∫0∞(ai2+x2)1dx
积分那一块根据题目给的信息,用换元法可以积出来,可得
∑
i
=
1
n
1
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
∫
0
∞
1
(
a
i
2
+
x
2
)
  
d
x
=
∑
i
=
1
n
1
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
⋅
π
2
⋅
a
i
\sum_{i=1}^n \frac 1{\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)} \int_0^\infty \frac 1{(a_i^2+x^2)}\;dx=\sum_{i=1}^n \frac 1{\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)} ·\frac \pi{2·a_i}
i=1∑n∏j=1n(j!=i)(aj2−ai2)1∫0∞(ai2+x2)1dx=i=1∑n∏j=1n(j!=i)(aj2−ai2)1⋅2⋅aiπ
于是题目原式
1
π
∫
0
∞
1
∏
i
=
1
n
(
a
i
2
+
x
2
)
  
d
x
=
∑
i
=
1
n
1
2
⋅
a
i
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
\frac 1{\pi}\int_0^\infty \frac 1{\prod^n_{i=1}(a_i^2+x^2)} \;dx=\sum_{i=1}^n \frac 1{2·a_i\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)}
π1∫0∞∏i=1n(ai2+x2)1dx=i=1∑n2⋅ai∏j=1n(j!=i)(aj2−ai2)1
先求和再取模可以转变为先取模再求和然后再取模
分母中的
∏
j
=
1
n
(
j
!
=
i
)
(
a
j
2
−
a
i
2
)
\prod^{n(j!=i)}_{j=1}(a_j^2-a_i^2)
j=1∏n(j!=i)(aj2−ai2)
可以用两个循环求得,最后乘上
2
⋅
a
i
2·a_{i}
2⋅ai,分数取模这里用费马小定理求逆元,把每个分数取模后的结果加起来,最后再取一次模即可得到答案。
for(i=1;i<=n;i++){
ll res=1;
for(j=1;j<=n;j++){
if(j==i) continue;//j不能等于i
res=((a[j]*a[j]-a[i]*a[i])%mod+mod)%mod*res%mod;//res存每次连乘的结果
}
ans=(ans+qpow(res*2*a[i]%mod)%mod)%mod;//res*2*a[i]即为每一个分母,ans储存每一个分数取模后的结果
}
printf("%lld\n",(ans+mod)%mod);
代码如下:
#include <iostream>
using namespace std;
typedef long long ll;//推荐用longlong类型,因为有些数据会爆int
const int maxn=1e3+5;//最大n值
const int mod=1e9+7;//模值
int n;
ll a[maxn];
ll qpow(ll x){//快速幂,用来求逆元
ll sum=1,pow=mod-2;
while(pow!=0){
if(pow%2==1) sum=(ll)sum*x%mod;
pow>>=1;
x=(ll)x*x%mod;
}
return (sum+mod)%mod;
}
int main(){
while(~scanf("%d",&n)){
int i,j;
ll ans=0,t;
for(i=1;i<=n;i++) scanf("%lld",&a[i]);
for(i=1;i<=n;i++){
ll res=1;//res来算每一个分数的分母中连乘的结果
for(j=1;j<=n;j++){
if(j==i) continue;//j不等于i
res=((a[j]*a[j]-a[i]*a[i])%mod+mod)%mod*res%mod;//连乘取模
}
ans=(ans+qpow(res*2*a[i]%mod)%mod)%mod;//res*2*a[i]即为每一个分母,ans储存每一个分数取模后的结果
}
printf("%lld\n",(ans+mod)%mod);//加起来,再取一次模
}
return 0;
}