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

Integration

题目链接

https://ac.nowcoder.com/acm/contest/881/B

公式转换,记录c[i]=1/(∏a[j]*a[j]-a[i]a[i])(j!=i)
答案为∑(c[i]/2
a[i])%mod,
即结果为(∑(∏a[j]*a[j]-a[i]*a[i])*2 *a[i]) 的逆元

公式转换

找规律:
可以证明

1/((y-x)(k+x)) +1/((x-y)(k+y))=1/((x-y)(y-x)) (通分后)

1/(x-y)(z-y)(k+y)) +1/(x-z)(y-z)(k+z))+1/(y-x)(z-x)(k+x))
=1/((k+x)(k+y)(k+z))

仔细发现对于更多的项都满足,由上面式子左边与右边总结得
∑i( 1/((∏j(a[j]-a[i]))(a[i]+k)))=(1/∏i(a[i]+k) ) (j!=i)

令a[i]=a[i]*a[i],k=x,问题就解决了

AC代码

#include
using namespace std;
#define ll long long
const int max1=1e3+5;
ll mod=1e9+7	;
ll a[max1];
void extgcd(ll a,ll b,ll& d,ll& x,ll& y){//扩展欧几里德
    if(!b){ d=a; x=1; y=0;}
    else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }
}
ll inv(ll a,ll n){
    ll d,x,y;
    extgcd(a,n,d,x,y);
    return d==1?(x+n)%n:-1;
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	ll sum,n,i,j;
	while(cin>>n)
	{
		ll ans=0;
		for(i=0;i>a[i];
		if(n==1){cout<

你可能感兴趣的:(2019牛客暑期多校训练营(第一场)-B)