JZOJ 3494. 【NOIP2013模拟联考13】线段(segment)
题目
数轴上有很多单位线段,一开始时所有单位线段的权值都是 \(1\)。有两种操作,第一种操作将某一区间内的单位线段权值乘以 \(w\),第二种操作将某一区间内的单位线段权值取 \(w\) 次幂。并且你还需要回答一些询问,每个询问需要求出某一区间的单位线段权值之积。由于答案可能很大,你只需要求出答案 \(mod (10^9+7)\) 的值。
说明:\(n\) 个点只有 \(n-1\) 条线段。
分析
线段树懒标记基本操作
幂运算优先,然后乘法运算
对于 \([-10^9,10^9]\) 的操作区间,直接动态开点就好了
离散化随你
注意:介于操作数乘起来很大,指数是不能随便取模的,所以我们需要扩展欧拉定理
即:
a^c \equiv a^c \texttt{ gcd(a,m)!=1 && c<m} \\
a^c \equiv a^{c \% \varphi(m)+\varphi(m)} \texttt{ gcd(a,m)!=1 && c>m}
\]
\(Code\)
#include<cstdio>
#define LL long long
using namespace std;
const int N = 2e6 + 5 , Ml = -1e9 , Mr = 1e9;
const LL P = 1e9 + 7 , phi = 1e9 + 6;
int n , sz = 1;
struct segment{
LL sum , tg1 , tg2;
int ls , rs;
}seg[N];
LL fpow(LL x , LL y)
{
LL res = 1;
for(; y; y >>= 1)
{
if (y & 1) res = res * x % P;
x = x * x % P;
}
return res;
}
void New(int k , int o)
{
if (!o)
{
if (!seg[k].ls)
seg[seg[k].ls = ++sz] = segment{1 , 1 , 1 , 0 , 0};
}
else
{
if (!seg[k].rs)
seg[seg[k].rs = ++sz] = segment{1 , 1 , 1 , 0 , 0};
}
}
void pushup(int k)
{
seg[k].sum = seg[seg[k].ls].sum * seg[seg[k].rs].sum % P;
}
void pushdown(int k , int l , int r)
{
if (seg[k].tg2 != 1)
{
New(k , 0) , New(k , 1);
seg[seg[k].ls].sum = fpow(seg[seg[k].ls].sum , seg[k].tg2);
seg[seg[k].rs].sum = fpow(seg[seg[k].rs].sum , seg[k].tg2);
seg[seg[k].ls].tg2 = seg[seg[k].ls].tg2 * seg[k].tg2 % phi;
seg[seg[k].rs].tg2 = seg[seg[k].rs].tg2 * seg[k].tg2 % phi;
seg[seg[k].ls].tg1 = fpow(seg[seg[k].ls].tg1 , seg[k].tg2);
seg[seg[k].rs].tg1 = fpow(seg[seg[k].rs].tg1 , seg[k].tg2);
seg[k].tg2 = 1;
}
if (seg[k].tg1 != 1)
{
int mid = (l + r) >> 1;
New(k , 0) , New(k , 1);
seg[seg[k].ls].sum = seg[seg[k].ls].sum * fpow(seg[k].tg1 , mid - l + 1) % P;
seg[seg[k].rs].sum = seg[seg[k].rs].sum * fpow(seg[k].tg1 , r - mid) % P;
seg[seg[k].ls].tg1 = seg[seg[k].ls].tg1 * seg[k].tg1 % P;
seg[seg[k].rs].tg1 = seg[seg[k].rs].tg1 * seg[k].tg1 % P;
seg[k].tg1 = 1;
}
}
void seg_mul(int l , int r , int k , int x , int y , int z)
{
if (x <= l && r <= y)
{
seg[k].sum = seg[k].sum * fpow(z , r - l + 1) % P;
seg[k].tg1 = seg[k].tg1 * z % P;
return;
}
pushdown(k , l , r);
int mid = (l + r) >> 1;
if (x <= mid) New(k , 0) , seg_mul(l , mid , seg[k].ls , x , y , z);
if (y > mid) New(k , 1) , seg_mul(mid + 1 , r , seg[k].rs , x , y , z);
pushup(k);
}
void seg_pow(int l , int r , int k , int x , int y , int z)
{
if (x <= l && r <= y)
{
seg[k].sum = fpow(seg[k].sum , z);
seg[k].tg1 = fpow(seg[k].tg1 , z) , seg[k].tg2 = seg[k].tg2 * z % phi;
return;
}
pushdown(k , l , r);
int mid = (l + r) >> 1;
if (x <= mid) New(k , 0) , seg_pow(l , mid , seg[k].ls , x , y , z);
if (y > mid) New(k , 1) , seg_pow(mid + 1 , r , seg[k].rs , x , y , z);
pushup(k);
}
LL seg_query(int l , int r , int k , int x , int y)
{
if (x <= l && r <= y) return seg[k].sum;
pushdown(k , l , r);
int mid = (l + r) >> 1; LL res = 1;
if (x <= mid && seg[k].ls) res = seg_query(l , mid , seg[k].ls , x , y);
if (y > mid && seg[k].rs) res = res * seg_query(mid + 1 , r , seg[k].rs , x , y) % P;
return res;
}
int main()
{
freopen("segment.in" , "r" , stdin);
freopen("segment.out" , "w" , stdout);
scanf("%d" , &n);
int op , l , r , w;
seg[0] = seg[1] = segment{1 , 1 , 1 , 0 , 0};
while (n--)
{
scanf("%d%d%d" , &op , &l , &r) , ++l;
if (op == 0) scanf("%d" , &w) , seg_mul(Ml , Mr , 1 , l , r , w);
else if (op == 1) scanf("%d" , &w) , seg_pow(Ml , Mr , 1 , l , r , w);
else printf("%lld\n" , seg_query(Ml , Mr , 1 , l , r));
}
}
JZOJ 3494. 【NOIP2013模拟联考13】线段(segment)的更多相关文章
- JZOJ 3493. 【NOIP2013模拟联考13】三角形
3493. [NOIP2013模拟联考13]三角形(triangle) (File IO): input:triangle.in output:triangle.out Time Limits: 10 ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)
3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB De ...
- JZOJ 3470. 【NOIP2013模拟联考8】最短路(path)
470. [NOIP2013模拟联考8]最短路(path) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 3463. 【NOIP2013模拟联考5】军训
3463. [NOIP2013模拟联考5]军训(training) (Standard IO) Time Limits: 2000 ms Memory Limits: 262144 KB Deta ...
- JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)
3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Det ...
- 【NOIP2013模拟联考7】OSU
[NOIP2013模拟联考7]OSU 描述 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分, ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
- [jzoj]3456.【NOIP2013模拟联考3】恭介的法则(rule)
Link https://jzoj.net/senior/#main/show/3456 Description 终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室.正当她们松了一口气时 ...
随机推荐
- ArcGIS 通过字段计算 设置顺序编码
地块编号="前缀" & left("0000",4-len( [FID]+1)) & ([FID] +1)
- 【Java SE】Day10接口、多态
一.接口 1.概述 是一种引用类型,是方法的集合,内部封装了各种方法 引用类型:数组.类.接口.包装类 2.方法的定义格式 抽象方法:无方法体,子类实现 默认方法: 静态方法:static修饰,可以由 ...
- 真正“搞”懂HTTP协议06之body的玩法(理论篇)
本来啊,本来,本来我在准备完善这个鸽了四年的系列的时候,是打算按照时间的顺序来完成的,好吧.我承认那个时候考虑的稍稍稍稍稍微有些不足,就是我忽略了HTTP协议的"模块性".因为虽然 ...
- uniapp详细入门教程
链接:https://www.ruletree.club/archives/2071/ 点击链接查看,内容详细,一学就会哦~! /******** * * .-~~~~~~~~~-._ _.-~~~~ ...
- vue 中安装并使用echart
本文为博主原创,转载请注明出处: 1.安装echart 依赖: 安装命令: npm install echarts --save 在vscode 的终端窗口进行执行,如图所示: 执行完之后,查看 项目 ...
- 图文并茂手把手教你How to copy files or directory in nodejs npm scripts编写脚本用npm或者node命令复制文件
每天都要开心哦~~~ 今天来个双语文档 先放出来官方文档 https://www.npmjs.com/package/copyfiles 先来说一下npm 执行的方式 1.首先,进入项目目录,下载依赖 ...
- 解决使用linux部署nodejs服务测试代码返回中文是乱码
今天写了个简单的node.js文件 代码如下 var http = require('http'); http.createServer(function (request, response) { ...
- three.js一步一步来--如何画出一个转动的正方体
基础知识--正方体代码如下 <template> <div style="width:1000px; height:800px"> <h1>正方 ...
- Java基础1-1-3—java基础语法(条件控制语句)
3. 条件控制语句 3.1 流程控制语句-顺序结构 流程控制语句:通过一些语句,来控制程序的[执行流程] 流程控制语句分类: 顺序结构 分支结构(if,switch) 循环结构(for,while,d ...
- 一篇文章带你掌握Flex布局的所有用法
Flex 布局目前已经非常流行了,现在几乎已经兼容所有浏览器了.在文章开始之前我们需要思考一个问题:我们为什么要使用 Flex 布局? 其实答案很简单,那就是 Flex 布局好用.一个新事物的出现往往 ...