P5686 和积和
写在前面
数学题接触的少,卡了半下午,愣是没想到直接往前缀和上考虑,按元素强推莽了半下午
Description
Solution
记 \(A,B\) 的前缀和序列分别为 \(sA,sB\)。
那么随便找一组数据,就会发现答案可以由一坨下标相等的前缀和积和减去另外一坨下标不等的前缀和积和。
而且下标相等的部分正好是对于每个下标 \(i\), \(sA_i sB_i\) 都被计算了 \(n\) 次。
那么加的部分就很好处理了。即:
\]
减的部分不难看出是 \(sA\) 与 \(sB\) 所有的一一对应且下标不同的组合。
所以对于每个 \(sA_i\),只需要让它去乘以所有的下标 \(j<i\) 的 \(sB_j\),并将结果求和。
对于每个 \(sb_i\) 亦然。
提公因式之后,由于计算过程是静态的,这个过程显然可以通过再预处理出一个超级前缀和 \(SA,Sb\),即前缀和的前缀和来优化实现。
那么这部分的计算式即为:
\]
总的式子即为:
\]
根据计算式易知时间复杂度为 \(\Theta(n)\)。
code:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int Maxn = 5e5 + 5;
const int mod = 1e9 + 7;
inline LL read() {
  LL f = 1, w = 0; char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
  return f * w;
}
LL n, t;
LL a[Maxn], b[Maxn];
LL Sa[Maxn], Sb[Maxn];
LL sa[Maxn], sb[Maxn];
LL ans;
int main()
{
	n = read();
	t = (n % mod + 1 % mod) % mod;
	for(register int i = 1; i <= n; ++i) a[i] = read() % mod;
	for(register int i = 1; i <= n; ++i) b[i] = read() % mod;
	for(register int i = 1; i <= n; ++i)
	{
		sa[i] = ((sa[i - 1] % mod) + (a[i] % mod)) % mod;
		sb[i] = ((sb[i - 1] % mod) + (b[i] % mod)) % mod;
		Sa[i] = ((Sa[i - 1] % mod) + (sa[i] % mod)) % mod;
		Sb[i] = ((Sb[i - 1] % mod) + (sb[i] % mod)) % mod;
		ans = ((ans % mod) + (((((sa[i] % mod) * (sb[i] % mod)) % mod) * (n % mod)) % mod)) % mod;
	}
	for(register int i = 2; i <= n; ++i)
	{
		ans = ((ans % mod) - (((sa[i] % mod) * (Sb[i - 1] % mod)) % mod) + mod) % mod;
		ans = ((ans % mod) - (((sb[i] % mod) * (Sa[i - 1] % mod)) % mod) + mod) % mod;
	}
	printf("%lld", ans);
	return 0;
}
P5686 和积和的更多相关文章
- 洛谷 P5686 [CSP-SJX2019]和积和
		传送门 思路 应用多个前缀和推出式子即可 \(30pts\): 首先如果暴力算的话很简单,直接套三层循环就好了(真的是三层!!最后两个\(sigma\)一起算就好了) \[\sum_{l = 1}^{ ... 
- 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”的长时间运算成为了可能.由于在去年一 ... 
- (2)卷积 & 卷积和
		参考资料:<信号与系统(第二版)> 杨晓非 何丰 连续信号的是卷积积分,离散信号的是卷积和. 脉冲分量 任意非周期信号,将横坐标分为若干个微小等分,得到Δτ为宽,f(kΔτ)为高的一系列微 ... 
随机推荐
- Omega System Trading and Development Club内部分享策略Easylanguage源码
			更多精彩内容,欢迎关注公众号:数量技术宅.关于本期分享的任何问题,请加技术宅微信:sljsz01 关于 Omega System Trading and Development Club " ... 
- 白嫖JetBrains正版全家桶!
			使用自己的开源项目,是可以白嫖JetBrains正版全家桶的! 前言 之前在学Go的时候,想着要用什么编辑器,网上的大佬都讲,想省事直接用Goland,用VsCode配置会存在一些未知的使用体验问题, ... 
- Java Tree 树 数据结构
			说到树结构就不得不回顾 链表结构 https://www.cnblogs.com/easyidea/p/13371863.html 如果链表结构中再多一个指针会是什么情况? 是不是像树根一样,这就是 ... 
- 痞子衡嵌入式:Farewell, 我的2020
			-- 题图:苏州大学老校门 2020年的最后一天,痞子衡驱车300多公里从苏州赶回了苏北老家(扬州某边陲小镇),连镇铁路虽然新通车了,解决了苏南苏北多年的铁路不直通问题,但奈何痞子衡老家小镇离最近的火 ... 
- 5.从零开始创建一个QT窗口按钮
			如何创建一个QT项目 如何创建一个QT项目 1.创建新项目 2.配置选择 3.增加按钮 4.按钮和窗体的大小标签图标设置 5.信号与槽 6.自定义信号与槽 代码 1.创建新项目 点击文件->新建 ... 
- Spring Boot中初始化资源的几种方式
			CommandLineRunner 定义初始化类 MyCommandLineRunner 实现 CommandLineRunner接口,并实现它的 run()方法,在该方法中编写初始化逻辑 注册成Be ... 
- HTTP 常用状态码200 301 302 403 500
			200(OK):成功处理了请求. 301 redirect: 301 代表永久性转移(Permanently Moved) //助记 1 永恒,如果你记住了这一条就算这篇博客没白写.302 redir ... 
- 初识分布式图数据库 Nebula Graph 2.0 Query Engine
			摘要:本文主要介绍 Query 层的整体结构,并通过一条 nGQL 语句来介绍其通过 Query 层的四个主要模块的流程. 一.概述 分布式图数据库 Nebula Graph 2.0 版本相比 1.0 ... 
- 使用 Admission Webhook 机制实现多集群资源配额控制
			1 要解决的问题 集群分配给多个用户使用时,需要使用配额以限制用户的资源使用,包括 CPU 核数.内存大小.GPU 卡数等,以防止资源被某些用户耗尽,造成不公平的资源分配. 大多数情况下,集群原生的 ... 
- Spring AOP之多切面运行顺序
			多切面运行顺序 当一个方法的执行被多个切面共同切的时候,环绕通知只影响当前切面的通知顺序,例如创建两个切面logUtil,validateUtil两个切面共同监视计算器类的加法运算,add(int a ... 
