[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Δτ)为高的一系列微 ...
随机推荐
- Inter IPP 绘图 ippi/ipps
IPP的资料网上比较少,主要还是参考Inter官网和文档 官方文档ipps.pdf主要是对数据做处理,包括加减乘除.FFT.DFT等 文档ippi.pdf只要是对图像做处理,包括通道转换.图片处理等 ...
- git上传项目已经删除文件,但是Jenkins中没有删除
jenkins 缓存造成的,需要清理工作空间
- CI集成Smarty的实现方式
给新伙伴的忠告:不要去想着有多复杂,看一遍绝对就会弄了! 这样集成的目的是什么? 因为我使用过CI和smarty,所以我就按自己的理解讲一下:CI框架在控制器.models方面做的很好,但在多变的视图 ...
- android data binding jetpack V 实现recyclerview 绑定
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
- RobotFramework测试库速查表
标准库 序号 标准库 说 明 1 Builtin 包含经常需要的关键字,自动导入无需import 2 Dialogs 提供了暂停测试执行和从用户的输入方式 3 Collections 提供一组关键词 ...
- append和push和pop区别
append() 操作的是DOM节点,在被选元素的结尾(内部结尾)插入指定内容: push() 向数组末尾插入一个或者多个元素,并且返回新的长度: pop() 删除 ...
- 转 Golang 入门 : 切片(slice)
https://www.jianshu.com/p/354fce23b4f0 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概 ...
- js的window.onscroll事件兼容各大浏览器
为窗口添加滚动条事件其实非常的简单, window.onscroll=function(){}; 注意在获取滚动条距离的时候 谷歌不识别document.documentElement.scrollT ...
- AutoCompleteTextView实现搜索提示功能的实现
AutoCompleteTextView和EditText组件类似,都可以输入文本.但AutoCompleteTextView组件可以和一个字符串数组或List对象绑定,当用户输入两个及以上字符时,系 ...
- Redis 高级应用
Redis SAVE 命令用于创建当前数据库的备份 该命令将在 redis 安装目录中创建dump.rdb文件. 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并 ...