题目

数轴上有很多单位线段,一开始时所有单位线段的权值都是 \(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. 【Shell案例】【awk和循环、NR、格式打印、全局变量、$0、通配符】12、打印每一行出现的数字个数

    写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数. 示例: 假设 nowco ...

  2. python爬虫爬取网易云音乐(超详细教程,附源码)

    一. 前言 先说结论,目前无法下载无损音乐,也无法下载vip音乐. 此代码模拟web网页js加密的过程,向api接口发送参数并获取数据,仅供参考学习,如果需要下载网易云音乐,不如直接在客户端下载,客户 ...

  3. SpringBoot内置tomcat启动过程及原理

    作者:李岩科 1 背景 SpringBoot 是一个框架,一种全新的编程规范,他的产生简化了框架的使用,同时也提供了很多便捷的功能,比如内置 tomcat 就是其中一项,他让我们省去了搭建 tomca ...

  4. VSCode编辑器极简使用入门

    VSCode(Visual Studio Code)是一款开源.跨平台.轻量级的代码编辑器,具有非常丰富的插件生态.他本身就是JavaScript + Electron ( /ɪˈlektrɒn/电子 ...

  5. js逆向到加密解密入口的多种方法

    一.hook hook又称钩子. 可以在调用系统函数之前, 先执行我们的函数. 例如, hook eval eval_ = eval; // 先保存系统的eval函数 eval = function( ...

  6. JavaScript:对象:如何读取、添加、删除对象的属性?

    如何给对象添加属性? 直接对象名.属性名去添加属性 直接对象名[属性名]去添加属性,此时属性名得是字符串类型,可以直接引号,也可以用变量名 如何读取对象的属性值? 这个操作,和添加属性是一样的,即用点 ...

  7. 获取VIP歌曲

    """ 分析需求 1,确定目标网址 2,获取目标网址的所有数据 3,筛选我们想要的数据 4,下载歌曲保存 """ import os imp ...

  8. prometheus-监控docker服务器

    1. prometheus-监控docker服务器 prometheus-监控docker服务器 cAdvisor(Container Advisor):用于收集正在运行的容器资源使用和性能信息. 项 ...

  9. MassTransit | 基于StateMachine实现Saga编排式分布式事务

    什么是状态机 状态机作为一种程序开发范例,在实际的应用开发中有很多的应用场景,其中.NET 中的async/await 的核心底层实现就是基于状态机机制.状态机分为两种:有限状态机和无限状态机,本文介 ...

  10. 《Effective C++》关于const,define等总结

    (将每一条item的总结和自己的理解给记录下来,以后有需要的话可以再回头参阅这些资料,不懂的再翻书温故.) Item 02:尽量以const ,enum,inline替换#define #define ...