首页 > 其他分享 >洛谷 B3645 数列前缀和 2 题解

洛谷 B3645 数列前缀和 2 题解

时间:2024-09-04 18:38:11浏览次数:12  
标签:洛谷 int 题解 线段 tr tl ans now B3645

前缀知识:枚举,费马小定理,逆元,线性乘法逆元,线段树(?)。

解法1:暴力

如题。暴力枚举即可,30分。由于太简单,不给代码。

解法2:前缀积+费马小定理+逆元

由于涉及静态区间,可以想到前缀积。前缀积公式为 \(q_r/q_{l-1}\),除法恰好可以用逆元来算。直接写即可。不会超时,因为时间为 \(O(n\log p)\),由于 \(p\) 很小,不会超时。但是仍然不够优秀。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,p=1145141;
int n,Q,a[N],q[N],ans;
int ksm(int a,int b){
	int ans=1;
	a%=p;
	while(b){
		if(b&1){
			ans=ans*a%p;
		}
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
signed main(){
	//freopen("xx.in","r",stdin);
	//freopen("xx.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>Q;
	q[0]=1;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		q[i]=q[i-1]*a[i]%p;
	}
	while(Q--){
		int l,r;
		cin>>l>>r;
		ans^=(q[r]*ksm(q[l-1],p-2)%p);
	}
	cout<<ans;
	return 0;
}

解法3:线性乘法逆元

由于 \(p\) 很小,可以想到线性乘法逆元。可以预处理出所有情况,这样查询就是 \(O(1)\) 了。但是预处理非常差劲,所以实际时间上不如上一种。(luogu数据的问题?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,p=1145141;
int n,Q,a[N],q[N],c[p],ans;
int ksm(int a,int b){
	int ans=1;
	a%=p;
	while(b){
		if(b&1){
			ans=ans*a%p;
		}
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
signed main(){
	//freopen("xx.in","r",stdin);
	//freopen("xx.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	c[1]=1;
	for(int i=2;i<p;i++){
		c[i]=c[p%i]*(p-p/i)%p;
	}
	cin>>n>>Q;
	q[0]=1;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		q[i]=q[i-1]*a[i]%p;
	}
	while(Q--){
		int l,r;
		cin>>l>>r;
		ans^=(q[r]*c[q[l-1]]%p);
	}
	cout<<ans;
	return 0;
}

解法4:线段树

没错,由于是区间,所以我们的线段树来了!用线段树不需要任何的数论知识,这意味着不会数学的小学生都能做!线段树是万能的!(线段树做法纯属瞎搞,请勿模仿)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,p=1145141;
int n,q,a[N],t[N*4],ans;
void build(int now,int tl,int tr){
	if(tl==tr){
		t[now]=a[tl];
		return ;
	}
	int mid=(tl+tr)/2;
	build(now*2,tl,mid);
	build(now*2+1,mid+1,tr);
	t[now]=t[now*2]*t[now*2+1]%p;
}
int query(int now,int tl,int tr,int l,int r){
	if(tl>=l&&tr<=r){
		return t[now];
	}
	if(tl>r||tr<l){
		return 1;
	}
	int mid=(tl+tr)/2;
	return query(now*2,tl,mid,l,r)*query(now*2+1,mid+1,tr,l,r)%p;
}
signed main(){
	//freopen("xx.in","r",stdin);
	//freopen("xx.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(q--){
		int l,r;
		cin>>l>>r;
		ans^=query(1,1,n,l,r);
	}
	cout<<ans;
	return 0;
}

总结

此题的做法很多,最好的一种是线段树,算是一个比较模板的题,所以没有太多讲解。

标签:洛谷,int,题解,线段,tr,tl,ans,now,B3645
From: https://www.cnblogs.com/wuyiming1263/p/18397140

相关文章

  • Codeforces Round 971 (Div. 4) E 题解析
    #E题Klee'sSUPERDUPERLARGEArray!!!题目描述思路:对于这道题,首先观察到题目求的是最小可能值,而且数据的范围是1e9范围,所以首先可以考虑的方法就是O(logn)的方法,而适合求最值的方法无疑就是二分搜索,可以通过二分来不断缩小答案的区间......
  • 常见问题解决 --- 如何给一个不支持配置代理的程序抓取https流量数据
    比如我有一个C#编写票务系统,它内嵌浏览器功能,我想抓取它的流量,但是这个客户端不支持配置代理设置解决办法:1.安装配置proxifier开启全局代理服务。安装好后网上有激活码激活一下,点击profile-proxyserver,添加一个代理服务器127.0.0.1,端口8080,协议https。点击profile-proxifi......
  • 历年CSP-J初赛真题解析 | 2017年CSP-J初赛阅读程序(23-26)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;intmain(){ intt[256]; strings; inti; cin>>s; for(i=0;i<256;i......
  • 2024年“羊城杯”粤港澳大湾区网络安全大赛 初赛 Web&数据安全&AI 题解WriteUp
    文章首发于【先知社区】:https://xz.aliyun.com/t/15442LyricsForYou题目描述:Ihavewrotesomelyricsforyou…开题。看一下前端源码,猜测有路径穿越漏洞http://139.155.126.78:35502/lyrics?lyrics=../../../../../etc/passwd简单看一下环境变量,没有flag。扫......
  • 中国电子学会Python3级等级考试202403编程题解析1
    1编程题目整数问题给定一个十进制整数n,求出从1到n的所有整数中出现“1”的个数。例如,n=2时,1,2出现1个“1”。n=12时,1,2,3,4,5,6,7,8,9,10,11,12,出现5个“1”。现编写一个程序,实现如下功能:输入整数n,执行程序后,输出该范围内出现“1”的个数。请完善程序。图1要完善的程序......
  • .net 使用IAsyncResultFilter或IResultFilter 进行restful统一风格在swagger ui中不显
    1.现实swaggerIOperationFilter 过滤器接口publicclassSwaggerOperationFilter:IOperationFilter{privatereadonlyISchemaGenerator_schemaGenerator;publicSwaggerOperationFilter(ISchemaGeneratorschemaGenerator){_schemaGenerator=......
  • 洛谷题单指南-常见优化技巧-P3143 [USACO16OPEN] Diamond Collector S
    原题链接:https://www.luogu.com.cn/problem/P3143题意解读:找到两个不相交的最长连续序列,使得序列最大值和最小值差不超过k,求两个最长的序列长度和。解题思路:先将所有数从小到大排序,记为a[]要找到两个不相交的最长连续序列,可以采用下面技巧:设b[i]表示i之前“差值在k之内的连续......
  • 洛谷题单指南-常见优化技巧-P4653 [CEOI2017] Sure Bet
    原题链接:https://www.luogu.com.cn/problem/P4653题意解读:选中的灯泡中,某一类较少的总权值减去灯泡数量所得到的收益最大值。解题思路:注意,此题关键是:要使得较少的收益最大化1、要最大化,意味着每次应该选择尽可能大权值的灯泡2、要使A、B类中较少的收益最大化,意味着每次应该优......
  • AGC004 题解
    目录A-DivideaCuboidB-ColorfulSlimesA-DivideaCuboid显然长方体必须被平行于某个面切开,否则不满足要求。枚举被哪个面切开,设这个面是\(a\timesb\),不属于这个面的棱长为\(c\),如果可以从正中间切开,即\(c\bmod2=0\)时就从正中间切开,红蓝块个数差值为\(0\)......
  • 2024 秋季PAT认证甲级(题解A1-A4)
    2024秋季PAT认证甲级(题解A-D)写在前面这一次PAT甲级应该是最近几次最简单的一次了,3个小时的比赛差不多30分钟就ak了(也是拿下了整场比赛的rk1),下面是题解报告,每个题目差不多都是20-30行代码,难度在洛谷普及组左右(cf1000-1200分)A.A-1HappyPatting题目描述The"HappyPatti......