Jupiter Atacks!

/**
题意:B,P,L,N,分别表示进制,mod,数组的个数,操作数
做法:树状数组 欧几里得 每个数加入到数组Tree的数是 B^(L-i)
用树状数组进行维护前缀和,然后求一段区间的数,除以B^(L-j)
因为(前缀和/B^(L-j)) 很大不好计算,所以就用乘法逆元
(k是a关于p的乘法的逆元) a*k≡1 (mod p) === (a/b)mod p (b关于p的乘法的逆元)
PS(当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。
我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。)
**/
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <stdio.h>
#define maxn 200000 + 10
using namespace std;
long long Tree[maxn];
long long mmap[maxn]; ///逆元
long long _next[maxn]; /// 次方
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
if(a == && b == ) return -;
if(b == )
{
x = ;
y = ;
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 == ) return (x%n+n)%n;
else return -;
}
long long B,P,L,N;
int lowbit(int x)
{
return x&(-x);
}
void add(int x, long long value)
{
for(int i = x; i <= L; i += lowbit(i))
{
Tree[i] = ((Tree[i] + value) % P + P) % P;
}
}
long long getsum(int x)
{
long long sum =;
for(int i=x; i; i -= lowbit(i))
sum = ((sum + Tree[i])%P + P)%P;
return sum;
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%lld %lld %lld %lld",&B,&P,&L,&N))
{
if(B == && P == && L == &&N == ) break;
memset(Tree,,sizeof(Tree));
memset(mmap,,sizeof(mmap));
memset(_next,,sizeof(_next));
int tmp = ;
mmap[L] = ;
_next[L] = ;
for(int i=L-; i>=; i--)
{
tmp = (tmp *B) %P;
mmap[i] = mod_reverse(tmp,P);
_next[i] = tmp;
} int u,v;
char ch[];
for(int i=; i<=N; i++)
{
scanf("%s %d %d",ch,&u,&v);
//cout<<ch<<" "<<u<<" "<<v<<endl;
if(ch[] == 'E')
{
long long ans = (getsum(u) - getsum(u-));
ans -= v*_next[u];
add(u,-ans);
}
else if(ch[] == 'H')
{
long long ans = ((getsum(v) - getsum(u-))%P +P)%P;
//cout<<"ans = "<<ans<<endl;
ans = (ans *mmap[v])%P;
printf("%lld\n",ans);
}
}
printf("-\n");
}
return ;
}

最新文章

  1. 【BZOJ 2152】聪聪可可 点分治
  2. Hibernate &lt;二级缓存&gt;
  3. Codeforces Round #165 (Div. 2)
  4. Threads in Spring
  5. MySQL 使用mysqld_multi部署单机多实例详细过程 (转)
  6. thinkphp分页格式的完全自定义,直接输入数字go到输入数字页
  7. HDOJ --- 2151 Worm
  8. Asp.net +Jquery-uploadify多文件上传
  9. mysql之inner join 和left join/right join
  10. C# 验证数字
  11. 一次dns缓存引发的惨案
  12. protocol_v2.go
  13. Java开发笔记(三十三)字符包装类型
  14. mysql 通过测试&#39;for update&#39;,深入了解行锁、表锁、索引
  15. 初始化HTML样式(转载)
  16. Tri Tiling(hdu1143)
  17. Hadoop ConnectTimeoutException
  18. Matlab入门笔记(1)
  19. 【微信公众号开发】【10】JSJDK相关
  20. C#根据淘宝接口网址获取客户端访问IP和网络运营商

热门文章

  1. css制作环形文本
  2. DFS(6)——hdu1342Lotto
  3. lubuntu 使用USB摄像头
  4. 一个简单的NetCore项目:2 - 登录
  5. stap用法
  6. 详细介绍javascript中的几种for循环的区别
  7. oracle分区技术提高查询效率
  8. 从统计学statistics的观点看概率分布
  9. [洛谷P3254]圆桌问题
  10. 安装全局webpack