4869: [Shoi2017]相逢是问候

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 1205  Solved: 409
[Submit][Status][Discuss]

Description

Informatikverbindetdichundmich.
信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以
分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是
输入的一个常数,也就是执行赋值ai=c^ai1 l r求第l个到第r个数的和,也就是输出:sigma(ai),l<=i<=rai因为
这个结果可能会很大,所以你只需要输出结果mod p的值即可。
 

Input

第一行有三个整数n,m,p,c,所有整数含义见问题描述。
接下来一行n个整数,表示a数组的初始值。
接下来m行,每行三个整数,其中第一个整数表示了操作的类型。
如果是0的话,表示这是一个修改操作,操作的参数为l,r。
如果是1的话,表示这是一个询问操作,操作的参数为l,r。
1 ≤ n ≤ 50000, 1 ≤ m ≤ 50000, 1 ≤ p ≤ 100000000, 0 < c <p, 0 ≤ ai < p
 

Output

对于每个询问操作,输出一行,包括一个整数表示答案mod p的值。
 

Sample Input

4 4 7 2
1 2 3 4
0 1 4
1 2 4
0 1 4
1 1 3

Sample Output

0
3

HINT

鸣谢多名网友提供正确数据,已重测!

Source

 
大家肯定都知道欧拉降幂公式了,就是x^y ≡ x^(y%p + [y>=p]*p )    mod p
这个厉害就厉害在可以在x和p不互质的情况下使用。
 
而且对于本题来说,我们可以发现一个位置最多被修改 log(P) 次就会永远成为一个定值。
所以我们暴力修改动态维护一下前缀和就好了。
 
注意,我们迭代的时候
 
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define maxn 50005
  4. using namespace std;
  5. int P[30],n,m,a[maxn];
  6. int f[maxn],len,C,opt,TP;
  7. int le,ri,tim[maxn],val[maxn];
  8. set<int> s;
  9. //set<int> ::iterator it;
  10.  
  11. inline int add(int x,int y,const int ha){
  12. x+=y;
  13. return x>=ha?x-ha:x;
  14. }
  15.  
  16. inline int mod(int x,int y,const int ha){
  17. ll P=x*(ll)y;
  18. return P>=ha?P%ha+ha:P;
  19. }
  20.  
  21. inline int phi(int x){
  22. int y=1;
  23. for(int i=2;i*(ll)i<=x;i++) if(!(x%i)){
  24. y*=(i-1),x/=i;
  25. while(!(x%i)) x/=i,y*=i;
  26. if(x==1) break;
  27. }
  28.  
  29. if(x!=1) return y*(x-1);
  30. else return y;
  31. }
  32.  
  33. inline void update(int x,int y){
  34. for(;x<=n;x+=x&-x) f[x]=add(f[x],y,P[0]);
  35. }
  36.  
  37. inline int query(int x){
  38. int an=0;
  39. for(;x;x-=x&-x) an=add(an,f[x],P[0]);
  40. return an;
  41. }
  42.  
  43. inline int ksm(int x,int y,const int ha){
  44. int an=1;
  45. for(;y;y>>=1,x=mod(x,x,ha)) if(y&1) an=mod(an,x,ha);
  46. return an;
  47. }
  48.  
  49. /*
  50. int get(int sit,int pos){
  51. if(sit==TP) return a[pos]>=P[sit]?a[pos]%P[sit]+P[sit]:a[pos];
  52. else return ksm(C,get(sit+1,pos),P[sit]);
  53. }
  54. */
  55.  
  56. inline void TOL(){
  57. int now=*s.lower_bound(le);
  58. for(;now<=ri;now=*s.upper_bound(now)){
  59. update(now,P[0]-val[now]);
  60. tim[now]++,TP=tim[now];
  61.  
  62. if(tim[now]>len) val[now]=1;
  63. else val[now]=(a[now]>=P[TP]?a[now]%P[TP]+P[TP]:a[now]);
  64. for(int i=TP-1;i>=0;i--){
  65. val[now]=ksm(C,val[now],P[i]);
  66. }
  67. val[now]%=P[0];
  68.  
  69. update(now,val[now]);
  70.  
  71. if(tim[now]==len+1) s.erase(now);
  72. }
  73. }
  74.  
  75. int main(){
  76. // freopen("9.in","r",stdin);
  77. // freopen("9.out","w",stdout);
  78.  
  79. scanf("%d%d%d%d",&n,&m,P,&C);
  80. for(len=1;;len++){
  81. P[len]=phi(P[len-1]);
  82. if(P[len]==1) break;
  83. }
  84. s.insert(0),s.insert(n+1);
  85. for(int i=1;i<=n;i++){
  86. scanf("%d",a+i);
  87. update(i,a[i]);
  88. s.insert(i);
  89. val[i]=a[i];
  90. }
  91.  
  92. while(m--){
  93. scanf("%d%d%d",&opt,&le,&ri);
  94. if(opt) printf("%d\n",add(query(ri),P[0]-query(le-1),P[0]));
  95. else TOL();
  96. }
  97.  
  98. return 0;
  99. }

  

2017 [六省联考] T2 相逢是问候的更多相关文章

  1. 2017 [六省联考] T5 分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 458  Solved: 299[Submit][Statu ...

  2. 2017 [六省联考] T1 期末考试

    4868: [Shoi2017]期末考试 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 842  Solved: 385[Submit][Status ...

  3. 2017 [六省联考] T6 寿司餐厅

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 450  Solved: 316[Submit][Status ...

  4. 洛谷 P3747 [六省联考2017]相逢是问候 解题报告

    P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...

  5. [BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)

    4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1313  Solved: 471[Submit][Stat ...

  6. 六省联考2017 Day1

    目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...

  7. 六省联考2017 Day2

    目录 2018.3.27 Test 总结 T1 T2 T3 BZOJ.4873.[六省联考2017]寿司餐厅(最小割ISAP 最大权闭合子图) 考试代码 T1 T2 T3 2018.3.27 Test ...

  8. [luogu] P3745 [六省联考2017]期末考试 (贪心)

    P3745 [六省联考2017]期末考试 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布. 第 \(i\) 位同学希望在第 \(t_i ...

  9. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

随机推荐

  1. POJ:2632-Crashing Robots

    Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Description In a modernized warehouse, robot ...

  2. poj--1064

    题意:有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的绳子的话,这K条绳子最长能有多长?答案保留到小数点后2位. 思路:这些最大最小化问题大多数可以用二分查找的方法来解题 用 d 表 ...

  3. Sublime插件开发——简单的代码模板插件

    最近一段一直使用sublime进行golang开发,整体感觉很不错,虽然比不上eclipse之类IDE强大,但是用起来很轻巧便捷,开发golang完全做够了.由于有一部分代码复用率很高,经常要用到,而 ...

  4. (手写)mybatis 核心配置文件和接口不在同一包下的解决方案

    smart-sh-mybatis项目 app.xml文件中此处配置为: <!-- 从整合包里找,org.mybatis:mybatis-spring:1.2.4 --> <!-- s ...

  5. Python之log的处理方式

    配置文件: #! /usr/bin/env python # -*- coding: utf-8 -*- """ logging配置 """ ...

  6. luogu2473 [SCOI2008]奖励关

    题解参照这里 每个研究完记得乘一个1/n,这是乘了概率. #include <iostream> #include <cstdio> using namespace std; ...

  7. asp.net多线程在web页面中简单使用

    需求:一个web页面 default.aspx 里面有两个控件GridView1,GridView2,通过两个线程分别加载绑定数据. 绑定GridView1:void BindCategory()  ...

  8. Leetcode17--->Letter Combinations of a Phone Number(电话号码对应的字母的组合)

    题目: 给定一个数字字符串,返回数字所能代表的所有字母组合: 举例: Input:Digit string "23" Output: ["ad", " ...

  9. [python subprocess学习篇] 调用系统命令

    http://www.jb51.net/article/57208.htm 3).Popen.communicate(input=None):与子进程进行交互.向stdin发送数据,或从stdout和 ...

  10. 【转】[重构]Primitive Obsession

    http://blog.csdn.net/wxr0323/article/details/7913950 Primitive Obsession(基本类型偏执) 偏执这个词实在是有点难懂.百度百科传送 ...