Description

给定两个下标从\(1\)到\(n\)编号的序列 \(a_i,b_i\),定义函数\(S(l,r)(1\le l\le r\le n)\)为:

\[\sum_{i=l}^r a_i\times \sum_{i=l}^r b_i
\]

请你求出下列式子的值:

\[\sum_{l=1}^n \sum_{r=l}^n S(l,r)
\]

由于答案可能很大,你只需要给出答案模 \(10^9+7\)后的结果。

Input

第一行一个正整数\(n\)表示序列长度。

第二行\(n\)个正整数表示\(a_i\)。

第三行\(n\)个正整数表示\(b_i\)。

Output

仅一行一个整数表示答案模\(10^9+7\)后的结果。

Sample Input1

3
2 3 4
3 4 5

Sample Output1

244

Sample Input2

5
11 22 33 44 55
12 34 56 78 90

Sample Output2

201542

Hint

对于\(20\%\)的数据:\(n\le 10\) , \(a_i,b_i\le 10\);

对于\(40\%\)的数据:\(n\le 200\) , \(a_i,b_i\le 100\);

对于\(70\%\)的数据:\(n\le 3000\) , \(a_i,b_i\le 10^5\);

对于\(100\%\)的数据:\(3\le n\le 5\times 10^5\) , \(1\le a_i,b_i\le 10^9\);

题解


\(PS\):我们机房里的\(OIer\)几乎都做出来了,下面分别给出一下几个人的理解


OItby

考虑第\(i\)列的\(a_i\)与\(b_i\),它可以与第\(j(1\le j\le i-1)\)列的到第\(i\)列组成一个\(S(l,r)\),我们用\(sa\)记录前\(i-1\)个\(a\)将与\(b_i\)乘多少次,用\(sb\)记录前\(i-1\)个\(b\)将与\(a_i\)乘多少次,\(f_i\)记录\(\sum_{j=1}^i S(j,i)\),答案就是\(\sum_{i=1}^n f_i\)

#include<iostream>
#include<cstdio>
using namespace std; typedef long long ll;
const ll MOD=(1e+9)+7;
const int N=(5e+5)+1;
ll a[N],b[N],sa,sb,f,Ans; void Scanf(ll &num)
{
int n=0; char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') n=(n<<3)+(n<<1)+(c^48),c=getchar();
num=n;
} int main()
{
int n;
scanf("%d",&n);
for(register int i=1;i<=n;++i) Scanf(a[i]);
for(register int i=1;i<=n;++i) Scanf(b[i]);
for(register int i=1;i<=n;++i)
{
f=(f+sa*b[i]+sb*a[i]+(i*a[i])%MOD*b[i])%MOD,
sa=(sa+i*a[i])%MOD,
sb=(sb+i*b[i])%MOD,
Ans=(Ans+f)%MOD;
}
cout<<Ans<<endl;
return 0;
}

lxyzxzy

  • T2终于写出来啦!

\(70~pts\)前缀和

#include<iostream>
#include<cstdio>
using namespace std;
const int inf=1e9+7;
const int N=5e5+5;
int a[N],b[N];long long suma[N],sumb[N];
int main()
{
int n;long long ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),suma[i]=(suma[i-1]+a[i])%inf;
for(int i=1;i<=n;i++) scanf("%d",&b[i]),sumb[i]=(sumb[i-1]+b[i])%inf;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++) ans=(ans+(suma[j]-suma[i-1])*(sumb[j]-sumb[i-1]))%inf;
cout<<ans<<endl;
return 0;
}

\(100~pts\)

#include<iostream>
#include<cstdio>
using namespace std;
const int inf=1e9+7;
long long a[500005],b;
inline int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s;
}
int main()
{
int n;long long ans=0,suma=0,sumb=0,t=0;
n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++)
{
b=read();
t=(t+(((suma*b)%inf)+(sumb*a[i])%inf)%inf)%inf;
t=(t+((a[i]*=i)%inf*b)%inf)%inf;
suma=(suma+a[i])%inf;
sumb=(sumb+i*b)%inf;
ans=(ans+t)%inf;
}
cout<<ans<<endl;
return 0;
}

YangChuYun

#include<bits/stdc++.h>
using namespace std;
const int INF=1e9+7,MAX=5e+6;
typedef long long LL;
LL a[MAX],b,sum1[MAX],sum2[MAX];
LL n,ans=0;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1,j=n;i<=n;i++,j--)
{
scanf("%lld",&b);
sum1[i]=sum1[i-1]+b*j;
if(sum1[i]>15000000000000)sum1[i]%=INF;
sum2[i]=sum2[i-1]+b*i;
if(sum2[i]>15000000000000)sum2[i]%=INF;
}
for(int i=1,j=n;i<=n;i++,j--)
{
ans=(ans+(a[i]*((sum1[n]-sum1[i-1])*i%INF+sum2[i-1]*j%INF)))%INF;
}
printf("%lld",ans);
return 0;
}

龙卷风

#include <iostream>
#include <cstdio>
using namespace std;
int Mod=1000000007;
long long ans=0,n,a[500001],b[500001];
inline int ReadIn(void)
{
int sum = 0;
int sign = 1;
char ch = getchar();
while(ch > '9' || ch < '0')
{
if(ch == '-')
{
sign = -1;
}
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
sum = sum*10+ch-'0';
ch = getchar();
}
return sum*sign;
}
int main()
{
n=ReadIn();
for(int i=1;i<=n;i++)
a[i]=ReadIn();
long long d=0,c=0,e=0;
for(int i=1;i<=n;i++)
{
b[i]=ReadIn();
d=(d+(n-i+1)*b[i])%Mod;
}
for(int i=1;i<=n;i++)
{
ans=(ans+a[i]*((d-e)*i%Mod+c*(n-i+1)%Mod)%Mod)%Mod;
c=(c+i*b[i])%Mod;
e=(e+(n-i+1)*b[i])%Mod;
}
printf("%d",ans);
return 0;
}

[Luogu5686] 和积和的更多相关文章

  1. BZOJ_2956_模积和_数学

    BZOJ_2956_模积和_数学 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数 ...

  2. 浅谈卷积和C++实现

    1 信号处理中的卷积 无论是信号处理.图像处理还是其他一些领域,我们经常会在一些相互关联的数据处理中使用卷积.卷积可以说是算法中一个非常重要的概念.这个概念最早起源于信号处理之中. 假设对于一个线性系 ...

  3. P2260 [清华集训2012]模积和

    P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ ...

  4. 【BZOJ】2956:模积和

    Time Limit: 10 Sec  Memory Limit: 128 MB Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j ...

  5. 【BZOJ2956】模积和 分块

    [BZOJ2956]模积和 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m ...

  6. 矩阵内积和Schur补

    > Many problems in the field of signal processing have been expended into matrix problems.So it's ...

  7. BZOJ 1968_P1403 [AHOI2005]约数研究--p2260bzoj2956-模积和∑----信息学中的数论分块

    第一部分 P1403 [AHOI2005]约数研究 题目描述 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机“Samuel II”的长时间运算成为了可能.由于在去年一 ...

  8. 洛谷 P5686 [CSP-SJX2019]和积和

    传送门 思路 应用多个前缀和推出式子即可 \(30pts\): 首先如果暴力算的话很简单,直接套三层循环就好了(真的是三层!!最后两个\(sigma\)一起算就好了) \[\sum_{l = 1}^{ ...

  9. (2)卷积 & 卷积和

    参考资料:<信号与系统(第二版)> 杨晓非 何丰 连续信号的是卷积积分,离散信号的是卷积和. 脉冲分量 任意非周期信号,将横坐标分为若干个微小等分,得到Δτ为宽,f(kΔτ)为高的一系列微 ...

随机推荐

  1. linux下防止rm-rf /删除,让人崩溃

    1.下载safe-rm软件: safe-rm下载地址: https://launchpad.net/safe-rm命令 wget -c https://launchpadlibrarian.net/1 ...

  2. Java线程之wait()、notify()、notifyAll()

    翻译:https://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 简述 java中Objct对象包含三个 ...

  3. 回调函数(callback) python / c++ 演示

    什么是回调函数? 我们绕点远路来回答这个问题. 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是 ...

  4. ubuntu下apt-get 命令参数

    转载:https://blog.csdn.net/linuxzhouying/article/details/7192612 ubuntu下apt-get 命令参数 常用的APT命令参数 apt-ca ...

  5. php 获取域名

    echo 'SERVER_NAME:'.$_SERVER['SERVER_NAME'];  //获取当前域名(不含端口号) echo '<p>';   echo 'HTTP_HOST:'. ...

  6. ArrayList && HashMap扩容策略

    ArrayList扩容策略:默认10 扩容时是base + base/2, 即10 15 22 33 49...扩容时不安全:grow方法扩容时,赋值 elementData = Arrays.cop ...

  7. mysql之备份与恢复

    数据备份全备 备份命令 :mysqldump把数据库的数据以sql语句导出属于逻辑备份 格式 : mysqldump -uroot -p123456 -S 多实例的mysql.sock 数据库名 &g ...

  8. python3 http.server 本地服务支持跨域

    创建start.py,代码如下: #!/usr/bin/env python try: # Python 3 from http.server import HTTPServer, SimpleHTT ...

  9. mongdb mapReduce聚合操作

    1.数据准备 请看group操作 2.mapReduce名词解释 mapReduce 随着"大数据"概念而流行.其实mapReduce的概念非常简单,从功能上说,相当于RDBMS的 ...

  10. Python——GUI编程 利息计算器 作业9(python programming)

    import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class ...