题意:

单点更新,区间求和,求和操作和普通的求和不一样,如果我们要求2~5的和,sum=1*f[5]+b*f[4]+b*b*f[3]+b*b*b*f[2],输出每个询问操作的答案,同时答案要模p。

思路:
我们可以在操作的时候直接给每个位置的数字成上b的多少次幂,例如如果是五个数字,我们插入f1时,我们不插入f1,而是插入f1*b*b*b*b,插入f2时,我们插入f2*b*b*b,这样,询问的时候我们就可以直接区间求和,再除以一个b的多少次幂。同时要注意,除法取模要求逆元,计算b的次幂的时候要用快速幂,被红书的快速幂坑了。。。它的那个取模不够彻底。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>using namespace std;long long _b,_p,_l,_n;long long pow_mod(long long a,long long i,long long n)
{if(i==0)return 1%n;int temp=pow_mod(a%n,i>>1,n)%n;temp=(temp%n*temp%n)%n;if(i&1)temp=(long long)temp*a%n;return temp;
}long long extend_gcd(long long a,long long b,long long &x,long long &y)
{  if(a==0&&b==0) return -1;//无最大公约数  if(b==0){x=1;y=0;return a;}  long long d=extend_gcd(b,a%b,y,x);  y-=a/b*x;  return d;
}  long long mod_reverse(long long a,long long n)
{  long long x,y;  long long d=extend_gcd(a,n,x,y);  if(d==1) return (x%n+n)%n;  else return -1;
}  const long long maxn=100005;
long long Tree[maxn+10];
inline long long lowbit(long long x)
{return x&(-x);
}void add(long long x,long long value)
{for(long long i=x;i<=maxn;i+=lowbit(i)){Tree[i]+=value;Tree[i]%=_p;}
}long long get(long long x)
{long long sum=0;for(long long i=x;i;i-=lowbit(i)){sum+=Tree[i];sum%=_p;}return (sum);
}int main()
{//cout << pow_mod(2, 10, 1000000) << endl;while(scanf("%lld%lld%lld%lld",&_b,&_p,&_l,&_n)!=EOF){memset(Tree,0,sizeof Tree);if(!_b&&!_p&&!_l&&!_n)return 0;for(long long i=1;i<=_n;i++){char s[3];long long x,y;scanf("%s%lld%lld",s,&x,&y);if(s[0]=='E'){y%=_p;long long tmp=(get(x)-get(x-1)+_p)%_p;// printf("tmp=%lld\n",tmp);//  printf("lala=%lld\n",(y*pow_mod(_b,_l-x,_p)%_p-tmp+_p)%_p);add(x,(y*pow_mod(_b%_p,_l-x,_p)%_p-tmp+_p)%_p);//add(x,y);}else{long long ans=(get(y)%_p-get(x-1)%_p+_p)%_p;//    printf("---------------- %lld %lld \n",get(y),get(x-1));//    printf("chu=%lld\n",pow_mod(_b%_p,_l-y,_p));//   printf("ans=%lld\n",ans);ans%=_p;long long ni=mod_reverse(pow_mod(_b%_p,_l-y,_p),_p);ni%=_p;ans*=ni;printf("%lld\n",ans%_p);}}printf("-\n");}return 0;
}

uvalive5798(树状数组)相关推荐

  1. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  2. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  3. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  4. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  5. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  6. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  7. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  8. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  9. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

最新文章

  1. python退出程序-【转】python 退出程序的方式
  2. matlab 轴旋转图像,求助,二维图像如何绕轴旋转成为三维图像
  3. (转)Kinect背景移除支持多人
  4. Spring Bean的生命周期以及IOC源码解析
  5. 20160828小结
  6. python爬取知乎用户信息_python爬取知乎用户总结
  7. 1、pandas入门示例
  8. Mybatis Configuration.xml中properties属性定义
  9. bin文件无法生成,Error: Q0147E: Failed to create Directory ./Flora_GD32.bin\ER$$.ARM.__AT_0x000000C0: File
  10. 计算机学科导论-2013级教学材料
  11. B2C商家怎样在有限的预算下展开营销
  12. 系统集成项目管理工程师(软考中级)—— 第二十二章 安全管理 笔记分享
  13. 23种设计模式(自学笔记)
  14. C盘空间不足,UE4的deriveddatacache目录位置修改
  15. My Heart Will Go On(我心永恒)
  16. 如何在线引入 阿里巴巴矢量图标库?
  17. 5分钟搞懂什么是深度学习
  18. 蓝桥杯练习系统-基础练习
  19. 属性动画、帧动画、补间动画
  20. PHP 短信验证码验证(短信宝)

热门文章

  1. ustc小道消息20211227
  2. 科大星云诗社动态20210823
  3. 简述Hadoop和Spark的异同
  4. Delphi中DLL初始化和退出处理
  5. (COPY)document.all和document.getElementById用法 document.all用法:
  6. 多组测试数据求最大值
  7. 计算1+2+……+N的和。
  8. easyUI tabs 显示与隐藏 tab 页
  9. 《2020总结-2021展望》
  10. LIVE555再学习 -- VLC搭建RTSP服务器(转)