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次询问,每一次询 ...
随机推荐
- Unity VR编辑器――如上帝般创建VR内容,Project Soli google用雷达识别手势体积相当于一张 Mini SD 内存卡
Unity VR编辑器――如上帝般创建VR内容在GDC的一个活动中,Unity首席设计师Timoni West展示了最新的Unity VR编辑器的原型系统,让你如上帝般创建VR应用,从一片空白场景开始 ...
- 怎么归档老日志的shell脚本
本脚本来自有学习阿铭的博文学习:工作中,需要用到日志切割logrotate,按照各自的需要切割.定义保留日志.提示:本文中的S全部都$符,不要问为什么,马云爸爸的社区就这样. #用途:日志切割归档.按 ...
- PHP-ThinkPHP5砍价活动相关设计
近期我们公司项目里陆陆续续有很多为了招引新用户的活动推出,砍价的活动由我来负责,我们的项目是在微信浏览器里供用户浏览访问. 大概描述:进入砍价活动列表页选择有意向的商品,用户点击商品图片可以看到WEB ...
- CSS 基础知识点 样式 选择器 伪类
CSS 基础知识点汇集 版权声明:这篇博客是别人写的,大神博客地址 : https://www.cnblogs.com/Mtime/p/5184685.html 1.CSS 简介 CSS 指层叠样式表 ...
- 20145127《java程序设计》第六周学习总结
教材学习内容总结 第十章 输入与输出 文件的读写 网络上传数据的基础 10.1 InputStream与OutputStream 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而 ...
- 20145317彭垚《网络对抗》Exp2 后门原理与实践
20145317彭垚<网络对抗>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 在网上下载软件的时候,后门很有可能被捆绑在下载的软件当中: 例举你 ...
- 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解
20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...
- 20145335郝昊《网络攻防》Exp9 Web安全基础实践
20145335郝昊<网络攻防>Exp9 Web安全基础实践 实验内容 理解常用网络攻击技术的基本原理. 完成WebGoat实践下相关实验 实验步骤 XSS注入攻击 Phishing wi ...
- Android 手机小闹钟
Android 手机小闹钟 一.这一篇主要使用系统为我们提供的一个服务AlarmManager来制作一个Android小闹钟,同时还涉及到了自定义主题.判断第一次启动应用.自定义动画.对话框.制作关闭 ...
- Python3基础 list 查看filter()返回的对象
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...