链接:E.简单数据结构1

题意:

给一个长为n的序列,m次操作,每次操作:
1.区间
2.对于区间,查询 ,一直到-
请注意每次的模数不同。
 
题解:扩展欧拉定理降幂

对一个数p取log(p)次的欧拉函数等于1,故可将操作2的复杂度降到log(p),可以直接求解。用树状数组的小技巧,可以在log的时间直接求出当前的a[i]。具体见代码。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const double EPS = 1e-;
  5. const int INF = 0x3f3f3f3f;
  6. const int mod = 1e9 + ;
  7. const int maxn = 5e5 + ;
  8. const int maxm = 2e7 + ;
  9. int n, m;
  10. long long a[maxn], bit[maxn];
  11. int phi[maxm];
  12.  
  13. void Eul_list(int n) //欧拉函数_list
  14. {
  15. memset(phi, , sizeof(phi));
  16. phi[] = ;
  17.  
  18. for(int i = ; i < n; i++){
  19. if(!phi[i]){
  20. for(int j = i; j < n; j += i){
  21. if(!phi[j]) phi[j] = j;
  22. phi[j] = phi[j] / i * (i - );
  23. }
  24. }
  25. }
  26. }
  27.  
  28. void add(int i, long long d)
  29. {
  30. while(i < maxn){
  31. bit[i] += d;
  32. i += -i & i;
  33. }
  34. }
  35.  
  36. long long sum(int i)
  37. {
  38. long long ans = ;
  39. while(i){
  40. ans += bit[i];
  41. i -= -i & i;
  42. }
  43. return ans;
  44. }
  45.  
  46. long long Mod(long long x, long long y) //欧拉定理的条件
  47. {
  48. return x < y ? x : x % y + y;
  49. }
  50.  
  51. long long pow_mod(long long x, long long n, long long mod)
  52. {
  53. long long ans = ;
  54. x = Mod(x, mod);
  55. while(n){
  56. if(n & ) ans = Mod(ans * x, mod);
  57. x = Mod(x * x, mod);
  58. n >>= ;
  59. }
  60. return ans;
  61. }
  62.  
  63. long long dfs(int l, int r, int p)
  64. {
  65. long long val = sum(l);
  66. if(l == r || p == ) return Mod(val, p); //降幂加速
  67. return pow_mod(val, dfs(l + , r, phi[p]), p);
  68. }
  69.  
  70. int main()
  71. {
  72. scanf("%d%d", &n, &m);
  73. for(int i = ; i <= n; i++){
  74. scanf("%lld", &a[i]);
  75. add(i, a[i] - a[i-]); //对i求前缀和及为a[i]
  76. }
  77.  
  78. Eul_list(maxm);
  79.  
  80. int op, l, r, x;
  81. while(m--){
  82. scanf("%d%d%d%d", &op, &l, &r, &x);
  83. if(op == ){
  84. //只需要当前数时的更新技巧
  85. add(l, x);
  86. add(r + , -x);
  87. }
  88. else printf("%lld\n", dfs(l, r, x) % x);
  89. }
  90.  
  91. return ;
  92. }

牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)的更多相关文章

  1. 牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)

    https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. #include<iost ...

  2. 牛客网多校第5场 H subseq 【树状数组+离散化】

    题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...

  3. 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】

    题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...

  4. 牛客练习赛22 C 简单瞎搞题

    //位运算 // & 都是1 才是 1 // | 都是0 才是0 // ^ 不一样才是1 #include <iostream> #include <cstdio> # ...

  5. BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组

    BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加 ...

  6. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  7. 牛客练习赛22 简单瞎搞题(bitset优化dp)

    一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 输入描述: 第一行一个数 n. 然后 n 行,每行两个数表示 li,ri.   输出 ...

  8. 牛客练习赛43-F(简单容斥)

    题目链接:https://ac.nowcoder.com/acm/contest/548/F 题意:简化题意之后就是求[1,n]中不能被[2,m]中的数整除的数的个数. 思路:简单容斥题,求[1,n] ...

  9. 【牛客练习赛22 C】

    https://www.nowcoder.com/acm/contest/132/C 题目大意:在n个区间中取出n个数,相加的和一共会出现多少种结果. 题目分析:对于这种挑选数字相加,由于每一步不同的 ...

随机推荐

  1. POJ-2481 Cows---树状数组的运用

    题目链接: https://vjudge.net/problem/POJ-2481 题目大意: if Si <= Sj and Ej <= Ei and Ei - Si > Ej - ...

  2. 【转】VMware虚拟机系统无法上网怎么办?

    有很多用户通过安装VMware软件来创建虚拟机系统,其中就有部分用户在创建好虚拟机系统后遇到无法上网的问题,下面PC6苹果网小编就给大家带来VMware虚拟机系统下无法上网的解决办法: 1.在虚拟机右 ...

  3. Thread 创建线程

    1.该线程变量 无参数 我们可以把线程的变量 理解为一个 委托.可以指向一个方法.有点像c语言中的指向函数的指针. 第1步我们创建了 Thread变量t1 ,第2步创建了一个方法threadChild ...

  4. 【转】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

    转载自:http://m.blog.csdn.net/blog/lihongli528628/45483463 [git 删除本地分支] git branch -D br [git 删除远程分支] g ...

  5. CNMeM is disabled

    See here: http://deeplearning.net/software/theano/library/config.html You can change this in the env ...

  6. 创建git及其初始化

    创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: $ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit 初始化一个 ...

  7. System.IO 二

    接着上篇的来  System.IO FileSystemWatcher    指向这个签名的方法   可以监听目录发生了什么事件 例如: static void Main(string[] args) ...

  8. vs code配置c/c++调试环境+mingw+windows

    目录 1.安装codeblocks 2.配置mingw环境变量 3.配置.vscode文件夹的json文件 ref 1.安装codeblocks 我已经安装过vscode和c++扩展插件,现在需要g+ ...

  9. lintcode_69_二叉树的层次遍历

    二叉树的层次遍历   描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? LinkedIn Airb ...

  10. Zeppelin interperter 模式设置总结图解1

    如有错漏,望请指正,不胜感激. 参考:[zeppelin官网]:https://zeppelin.apache.org/docs/latest/interpreter/spark.html#inter ...