Sasha and a Very Easy Test CodeForces - 1109E (数学,线段树)
大意: 给定n元素序列, q个操作: (1)区间乘 (2)单点除(保证整除) (3)区间求和对m取模
要求回答所有操作(3)的结果
主要是除法难办, 假设单点除$x$, $x$中与$m$互素的素因子可以直接欧拉求逆, 其余因子维护一个向量即可.
这种沙茶题结果各种细节出错改了一个多小时......太菜了
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
//head const int N = 1e5+10; int n, m, q, sz, Phi;
vector<int> A; int phi(int x) {
int s = x, mx = sqrt(x+0.5);
REP(i,2,mx) if (x%i==0) {
s = s/i*(i-1);
A.pb(i);
while (x%i==0) x/=i;
}
if (x>1) A.pb(x),s=s/x*(x-1);
sz = A.size();
return s;
} ll qpow(ll a,ll n) {ll r=1%m;for (a%=m;n;a=a*a%m,n>>=1)if(n&1)r=r*a%m;return r;} int sum[N<<2], rtag[N<<2], tag[N<<2], res[N<<2];
int c[N<<2][10], tagc[N<<2][10];
int ans, ql, qr, qv[10]; void pd(int o) {
if (tag[o]!=1) {
tag[lc] = (ll)tag[lc]*tag[o]%m;
tag[rc] = (ll)tag[rc]*tag[o]%m;
sum[lc] = (ll)sum[lc]*tag[o]%m;
sum[rc] = (ll)sum[rc]*tag[o]%m;
tag[o] = 1;
}
if (rtag[o]!=1) {
res[lc] = (ll)res[lc]*rtag[o]%m;
res[rc] = (ll)res[rc]*rtag[o]%m;
rtag[lc] = (ll)rtag[lc]*rtag[o]%m;
rtag[rc] = (ll)rtag[rc]*rtag[o]%m;
rtag[o] = 1;
}
REP(i,0,sz-1) {
c[lc][i]+=tagc[o][i],c[rc][i]+=tagc[o][i];
tagc[lc][i]+=tagc[o][i],tagc[rc][i]+=tagc[o][i];
tagc[o][i]=0;
}
} void pu(int o) {
sum[o]=(sum[rc]+sum[lc])%m;
} void build(int o, int l, int r) {
sum[o]=res[o]=tag[o]=rtag[o]=1;
if (l==r) {
int t;
scanf("%d", &t);
sum[o] = t%m;
REP(i,0,sz-1) {
while (t%A[i]==0) t/=A[i],++c[o][i];
}
res[o] = t%m;
return;
}
build(ls),build(rs);
pu(o);
} void mul(int o, int l, int r, int x, int R) {
if (ql<=l&&r<=qr) {
sum[o] = (ll)sum[o]*x%m;
tag[o] = (ll)tag[o]*x%m;
res[o] = (ll)res[o]*R%m;
rtag[o] = (ll)rtag[o]*R%m;
REP(i,0,sz-1) c[o][i]+=qv[i],tagc[o][i]+=qv[i];
return;
}
pd(o);
if (mid>=ql) mul(ls,x,R);
if (mid<qr) mul(rs,x,R);
pu(o);
}
void div(int o, int l, int r, int x, int v) {
if (l==r) {
REP(i,0,sz-1) {
while (v%A[i]==0) v/=A[i],--c[o][i];
}
res[o] = (ll)res[o]*qpow(v,Phi-1)%m;
sum[o] = res[o];
REP(i,0,sz-1) sum[o]=(ll)sum[o]*qpow(A[i],c[o][i])%m;
return;
}
pd(o);
if (mid>=x) div(ls,x,v);
else div(rs,x,v);
pu(o);
}
void query(int o, int l, int r, int ql, int qr) {
if (ql<=l&&r<=qr) return (ans+=sum[o])%=m,void();
pd(o);
if (mid>=ql) query(ls,ql,qr);
if (mid<qr) query(rs,ql,qr);
} int main() {
scanf("%d%d", &n, &m);
Phi = phi(m);
build(1,1,n);
scanf("%d", &q);
while (q--) {
int op, x, p;
scanf("%d", &op);
if (op==1) {
scanf("%d%d%d",&ql,&qr,&x);
int t = x;
REP(i,0,sz-1) {
qv[i] = 0;
while (t%A[i]==0) t/=A[i],++qv[i];
}
mul(1,1,n,x,t);
} else if (op==2) {
scanf("%d%d",&p,&x);
div(1,1,n,p,x);
} else {
scanf("%d%d",&ql,&qr);
ans = 0, query(1,1,n,ql,qr);
printf("%d\n", ans);
}
}
}
Sasha and a Very Easy Test CodeForces - 1109E (数学,线段树)的更多相关文章
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)
Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...
- Sereja and Brackets CodeForces - 380C (线段树+分治思路)
Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...
- CodeForces 91B Queue (线段树,区间最值)
http://codeforces.com/problemset/problem/91/B B. Queue time limit per test: 2 seconds memory limit p ...
- codeforces 650D. Zip-line 线段树
题目链接 题目的意思很简单, 就是给你n个数, m个询问, 每次询问修改某一个位置的值, 然后问你修改完之后数列的lis是多少. 询问独立. 对于原数列, 我们将它离散化, 令dp1[i]为以i为结尾 ...
- Codeforces 343D WaterTree - 线段树, DFS序
Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...
随机推荐
- Java设计模式应用——适配器模式
性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出. 由于告警开发进度较快,已经实现了excel导出.csv导出.zip导出功能,现在报表需要excel导出.csv导出.pdf导出功 ...
- Unity VR编辑器――如上帝般创建VR内容,Project Soli google用雷达识别手势体积相当于一张 Mini SD 内存卡
Unity VR编辑器――如上帝般创建VR内容在GDC的一个活动中,Unity首席设计师Timoni West展示了最新的Unity VR编辑器的原型系统,让你如上帝般创建VR应用,从一片空白场景开始 ...
- 电脑异常断电,IDEA崩溃
今天电脑突然断电,当时正好开着idea,等了半天无果,只能强行关机重启.重启之后,那么问题来了:重新打开idea报错java.lang.AssertionError:upexpected conten ...
- live555 编译
项目里面需要简单的rtsp服务器来实现视频预览等功能: rtsp本来不是太复杂的东西,github上有很多功能都比较完善的项目可以随便拿来用,但是测试过程中发现live555还是有性能上的一些差异: ...
- RSA加解密用途简介及java示例
在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...
- 20145331魏澍琛《网络对抗》Exp8 Web基础
20145331魏澍琛<网络对抗>Exp8 Web基础 实践内容: 1.简单的web前端页面(HTML.CSS等) 2.简单的web后台数据处理(PHP) 3.Mysql数据库 4.一个简 ...
- BZOJ2662: [BeiJing wc2012]冻结 spfa+分层图
Description “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„” 在这个愿望被实现以后的世界里,人们享 ...
- BZOJ5293: [Bjoi2018]求和 树上差分
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...
- 【eclipse】聚合工程maven启动Tomcat报错
严重: Error configuring application listener of class严重: Skipped installing application listeners due ...
- 51nod 1444 破坏道路(最短路)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1444 题意: 思路: 哇,思路爆炸. 因为每条边的权值都为1,所以可以直 ...