题目

数轴上有很多单位线段,一开始时所有单位线段的权值都是 \(1\)。有两种操作,第一种操作将某一区间内的单位线段权值乘以 \(w\),第二种操作将某一区间内的单位线段权值取 \(w\) 次幂。并且你还需要回答一些询问,每个询问需要求出某一区间的单位线段权值之积。由于答案可能很大,你只需要求出答案 \(mod (10^9+7)\) 的值。

说明:\(n\) 个点只有 \(n-1\) 条线段。

分析

线段树懒标记基本操作

幂运算优先,然后乘法运算

对于 \([-10^9,10^9]\) 的操作区间,直接动态开点就好了

离散化随你

注意:介于操作数乘起来很大,指数是不能随便取模的,所以我们需要扩展欧拉定理

即:

\[a^c \equiv a^{c \% \varphi(m)} \texttt{ gcd(a,m)=1} \\
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)的更多相关文章

  1. JZOJ 3493. 【NOIP2013模拟联考13】三角形

    3493. [NOIP2013模拟联考13]三角形(triangle) (File IO): input:triangle.in output:triangle.out Time Limits: 10 ...

  2. JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...

  3. JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)

    3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  De ...

  4. JZOJ 3470. 【NOIP2013模拟联考8】最短路(path)

    470. [NOIP2013模拟联考8]最短路(path) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  5. JZOJ 3463. 【NOIP2013模拟联考5】军训

    3463. [NOIP2013模拟联考5]军训(training) (Standard IO) Time Limits: 2000 ms  Memory Limits: 262144 KB  Deta ...

  6. JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)

    3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  7. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)

    3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Det ...

  8. 【NOIP2013模拟联考7】OSU

    [NOIP2013模拟联考7]OSU 描述 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分, ...

  9. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  10. [jzoj]3456.【NOIP2013模拟联考3】恭介的法则(rule)

    Link https://jzoj.net/senior/#main/show/3456 Description 终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室.正当她们松了一口气时 ...

随机推荐

  1. 基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式

    前言 开发接口,是给客户端(Web前端.App)用的,前面说的RESTFul,是接口的规范,有了统一的接口风格,客户端开发人员在访问后端功能的时候能更快找到需要的接口,能写出可维护性更高的代码. 而接 ...

  2. 记一次在CentOS上安装GitLab的流程

    1.本次环境说明 系统:Centos7.6 IP地址:http://192.168.3.213: 最低配置要求:2核心CPU和4G内存,这是因为[GitLab]的整体运行包含了多个进程  2.自行安装 ...

  3. 三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot

    一.前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群. redis有两种高可用的方案: High availability with Re ...

  4. JS比较数值大小

    一. 简单循环算法 代码如下: const numbers = [5, 6, 2, 3, 7]; let max = -Infinity; for (let i = 0; i < numbers ...

  5. cornerstone4.1破解版&#160;for&#160;mac

    百度网盘: https://pan.baidu.com/s/1l_0rHMF11mZsUP3qJrp7Uw  密码: 8ei9

  6. 今天学到的新知识--自己的电脑可以像Github Pages、码云 Pages一样发布静态资源

    大佬教我的,感觉这个很神奇哦 假设下面这个路径是我的本地电脑静态资源路径 打开powershell窗口 然后按照下图的样子执行命令 复制网址就可以访问啦 然后可以通过 https://iplocati ...

  7. 超详细解锁Webpack步骤,踩坑记录

    webpack 核心 entry: 入口 output: 输出 loader: 模块转换器,用于把模块原内容按照需求转换成新内容 插件(plugins): 扩展插件,在webpack构建流程中的特定时 ...

  8. Swagger的基本使用

    Swagger简介和使用 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等等. ...

  9. java入门与进阶-P1.1+P1.2

    计算机与编程语言 计算机如何解决问题 !-- 首先计算机他是不知道自己需要去做什么的,它需要按照你所说的步骤一步一步进行直到结束 "请给我一杯水" 1.转身走到厨房; 2.找到一个 ...

  10. 论文翻译:2022_Time-Shift Modeling-Based Hear-Through System for In-Ear Headphones

    论文地址:基于时移建模的入耳式耳机透听系统 引用格式: 摘要 透传(hear-through,HT)技术是通过增强耳机佩戴者对环境声音的感知来主动补偿被动隔离的.耳机中的材料会减少声音 500Hz以上 ...