2019牛客暑期多校训练营(第一场)----B-Integration

首先发出题目链接:
链接: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 0i=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=(a22a12)(a12+x2)1+(a12a22)(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=(a22a12)(a32a12)(a12+x2)1+(a12a22)(a32a22)(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)} (a12a32)(a22a32)(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=(a22a12)(a32a12)(a42a12)(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)}+ (a12a22)(a32a22)(a42a22)(a22+x2)1+(a12a32)(a22a32)(a42a32)(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)} (a12a42)(a22a42)(a32a42)(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=1n(ai2+x2)j=1n(j!=i)(aj2ai2)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= 0i=1n(ai2+x2)1dx=0i=1n(ai2+x2)j=1n(j!=i)(aj2ai2)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=1nj=1n(j!=i)(aj2ai2)10(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=1nj=1n(j!=i)(aj2ai2)10(ai2+x2)1dx=i=1nj=1n(j!=i)(aj2ai2)12aiπ
于是题目原式
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)} π10i=1n(ai2+x2)1dx=i=1n2aij=1n(j!=i)(aj2ai2)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=1n(j!=i)(aj2ai2)
可以用两个循环求得,最后乘上 2 ⋅ a i 2·a_{i} 2ai,分数取模这里用费马小定理求逆元把每个分数取模后的结果加起来,最后再取一次模即可得到答案。

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;
} 
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值