[Luogu5686] 和积和
Description
给定两个下标从\(1\)到\(n\)编号的序列 \(a_i,b_i\),定义函数\(S(l,r)(1\le l\le r\le n)\)为:
\]
请你求出下列式子的值:
\]
由于答案可能很大,你只需要给出答案模 \(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] 和积和的更多相关文章
- BZOJ_2956_模积和_数学
BZOJ_2956_模积和_数学 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数 ...
- 浅谈卷积和C++实现
1 信号处理中的卷积 无论是信号处理.图像处理还是其他一些领域,我们经常会在一些相互关联的数据处理中使用卷积.卷积可以说是算法中一个非常重要的概念.这个概念最早起源于信号处理之中. 假设对于一个线性系 ...
- P2260 [清华集训2012]模积和
P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ ...
- 【BZOJ】2956:模积和
Time Limit: 10 Sec Memory Limit: 128 MB Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j ...
- 【BZOJ2956】模积和 分块
[BZOJ2956]模积和 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m ...
- 矩阵内积和Schur补
> Many problems in the field of signal processing have been expended into matrix problems.So it's ...
- BZOJ 1968_P1403 [AHOI2005]约数研究--p2260bzoj2956-模积和∑----信息学中的数论分块
第一部分 P1403 [AHOI2005]约数研究 题目描述 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机“Samuel II”的长时间运算成为了可能.由于在去年一 ...
- 洛谷 P5686 [CSP-SJX2019]和积和
传送门 思路 应用多个前缀和推出式子即可 \(30pts\): 首先如果暴力算的话很简单,直接套三层循环就好了(真的是三层!!最后两个\(sigma\)一起算就好了) \[\sum_{l = 1}^{ ...
- (2)卷积 & 卷积和
参考资料:<信号与系统(第二版)> 杨晓非 何丰 连续信号的是卷积积分,离散信号的是卷积和. 脉冲分量 任意非周期信号,将横坐标分为若干个微小等分,得到Δτ为宽,f(kΔτ)为高的一系列微 ...
随机推荐
- codevs 2804 最大最小数质因数 x
题目描述 Description 先输入n,n<=20;再依次输入n个不同的数,每个数<=1000000;找出最大数和最小数,并输出最大最小数的质 ...
- Java当中的IO流-时间api(下)-上
Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...
- [c++] C++多态(虚函数和虚继承)
转自:https://www.jianshu.com/p/02183498a2c2 面向对象的三大特性是封装.继承和多态.多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C+ ...
- JavaWeb_(SSH论坛)_一、项目入门
基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 项目已上传至gi ...
- sqoop数据导出
1.将oracle的jdbc的jar包copy到sqoop的lib目录下 2. sqoop export --connect jdbc:oracle:thin:@XXXXX:1521:TMDM --u ...
- 关于web前端开发,区别用户使用的终端设备代码
对web前端开发,熟知不同的浏览器,的解析是基本技能,下面,我就向大家展示一下,如何获得当前用户所用的终端设备.车子一发动,请准备上车................... <script> ...
- CentOS 安装 Mongodb详解 --- 无Linux基础
先去官方下载离线安装包:https://www.mongodb.com/ ftp连接一下服务器,把离线包上传上去 XShell连接一下: 解压文件(你输一点就可以按tab键,它会自动补全):tar - ...
- sql 新建表
CREATE TABLE `rims`.`rims_basic_dictionary_doctor_group` ( `id` INT(11) NOT NULL AUTO_INCREMENT prim ...
- 百度地图js判断点是否在圆形区域内
/** * Created by LEGION on 2018/10/11. *//** * @fileoverview GeoUtils类提供若干几何算法,用来帮助用户判断点与矩形. * 圆形.多边 ...
- javascript之String对象
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...