为了能到远方,脚下的每一步都不能少.|

Aurora-JC

园龄:3年粉丝:3关注:4

📂题解
🔖数学
2022-11-01 20:41阅读: 90评论: 0推荐: 0

P5686 [CSP-S2019 江西] 和积和

题意

给定两个下标从 1n 编号的序列 ai,bi,定义函数,

S(l,r)(1lrn)i=lrai×i=lrbi

要求出下列式子的值:l=1nr=1nS(l,r)

将答案模 1e9+7

分析

sai=j=1iaisbi=j=1ibisumai=j=1isaisumbi=j=1isbi
sumi=j=1iaj×bj

对于每一个 r

  • resr=l=1r(sarsal)×(sbrsbl)
  • resr=l=1rsar×sbrsal1×sbrsar×sbl1+sbl1×sal1
  • resr=r×sar×sbrsbr×sumar1×sar×sumbr1+sumr1

最后 ans=i=1nresi

记得变乘边模,特别是 i×sai×sbi 容易炸 int。

#include<bits/stdc++.h>
#define mod 1000000007
#define N 500005
#define int long long
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int n,ans;
int a[N],b[N],suma[N],sumb[N],sum[N];
signed main(){
n=read();
for(int i=1;i<=n;++i) a[i]=(read()+a[i-1])%mod;
for(int i=1;i<=n;++i) b[i]=(read()+b[i-1])%mod;
for(int i=1;i<=n;++i) suma[i]=(suma[i-1]+a[i])%mod;
for(int i=1;i<=n;++i) sumb[i]=(sumb[i-1]+b[i])%mod;
for(int i=1;i<=n;++i) sum[i]=(sum[i-1]+a[i]*b[i])%mod;
for(int i=1;i<=n;++i)
ans=(ans+(i*a[i]%mod*b[i]%mod+sum[i-1]%mod-((b[i]*suma[i-1]%mod+a[i]*sumb[i-1]%mod)%mod)+mod)%mod)%mod;
printf("%d\n",ans);
return 0;
}

本文作者:南风未起

本文链接:https://www.cnblogs.com/jiangchen4122/p/16849083.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Aurora-JC  阅读(90)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起