题目

数轴上有很多单位线段,一开始时所有单位线段的权值都是 \(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. 关于解决scapy.error.Scapy_Exception: tcpdump is not available. Cannot use filter !报错

    解决办法 sudo apt install tcpdump 后续 我特意没写到我的 arp 攻击那篇文章里面,就是为了水一片文章

  2. 同一服务器部署多tomcat以及MyEclipse添加多tomcat

    tomcat有很多版本但他们的部署方式并不因为版本的不同而改变其的部署方式,操作者不必考虑此等原因.本人办公电脑使用的是tomcat7,家里自用的是6版本,这里就以6版本为例实现同一台机器上部署多to ...

  3. PHP日期加减计算

    PHP 标准的日期格式 date("Y-m-d H:i:s"); PHP 简单的日期加减计算 <?php date_default_timezone_set('PRC'); ...

  4. 基于MATLAB的人民币识别系统

    1.选图背景 随着科技的发展,图像识别技术在计算机视觉领域起着越来越重要的作用,现已被应用到金融.军事.公安刑侦.生物医学.机器视觉等各个领域: 随着国民经济的快速发展,人民币大量流通市场,商业交易都 ...

  5. 秒懂 Golang 中的 条件变量(sync.Cond)

    本篇文章面向的读者: 已经基本掌握Go中的 协程(goroutine),通道(channel),互斥锁(sync.Mutex),读写锁(sync.RWMutex) 这些知识.如果对这些还不太懂,可以先 ...

  6. Jmeter 之 jp@gc - Stepping Thread Group

    jp@gc - Stepping Thread Group 自定义线程组,根据业务需要进行设计用户增加间隔时间等 1.  下载jmeter-plugins-manager-1.3.jar插件放入lib ...

  7. P8618 [蓝桥杯 2014 国 B] Log 大侠

    简要题意 给你一个长度为 \(n\) 的正整数序列 \(a\),有 \(m\) 个询问,每一个询问给出一个区间 \([l,r]\).定义函数 \(f(x)=\lfloor\log_{2}(x)+1\r ...

  8. jQuery查找标签、操作标签、事件和动画效果,Bootstrap页面框架的介绍和使用讲解

    今日内容 jQuery查找标签 1.基本选择器: $('#d1') id选择器 $('.c1') class选择器 $('div') 标签选择器 2.组合选择器: $('div#d1') 查找id是d ...

  9. Hugging Face - 推理(Inference)解决方案

    每天,开发人员和组织都在使用 Hugging Face 平台上托管的模型,将想法变成概念验证(proof-of-concept)的 demo,再将 demo 变成生产级的应用. Transformer ...

  10. WPF-3D图形

    WPF-3D图形 WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染.本文主要讲述了WPF-3D中的关键概念, 以及常用到的命中测试.2d控件如何在3D ...