[树状数组]uva 5798 Jupiter Atacks!
2012-08-18 21:13
309 查看
H(fi,...,fj)=
Bkfj-k(
modP)
Bkfj-k(
modP)
/**uva5798
动态更新fi的值,查询H(fi,...fj)写出f11,f12,...f15;f22,f23,,,f25;....
以最长的f15作参照,设a1...a5分别为f15的第5....1项,sum为a的和,
则f(i,j)=(sum(j)-sum(i-1))/b^(n-j)%p
求和用树状数组,模p用欧拉定理(题目关键2≤B<P≤109andPprime)。trick:注意减法会产生负数
*/
#include<stdio.h>
#include<string.h>
#defineN100001
#definelowbit(i)(i)&(-i)
__int64B
,f
,A
;
intn;
voidadd(inti,__int64c)
{
for(;i<=n;i+=lowbit(i))
A[i]+=c;
}
__int64sum(inti)
{
__int64ans=0LL;
for(;i>0;i-=lowbit(i))
ans+=A[i];
returnans;
}
__int64fpow(__int64a,__int64b,__int64p)
{
__int64ans=1LL;
while(b)
{
if(b&1)
ans=ans*a%p;
b>>=1;
a=a*a%p;
}
returnans;
}
intmain()
{
B[0]=1LL;
intq,i,j;
__int64b,p;
charask[4];
while(scanf("%I64d%I64d%d%d",&b,&p,&n,&q)!=EOF&&b)
{
memset(A,0,sizeof(A));
memset(f,0,sizeof(f));
for(i=1;i<n;++i)
B[i]=B[i-1]*b%p;
while(q--)
{
scanf("%s%d%d",ask,&i,&j);
if(ask[0]=='H')
{
printf("%I64d\n",(sum(j)-sum(i-1)+p)%p*fpow(B[n-j],p-2,p)%p);
continue;
}
add(i,(1LL*j-f[i]+p)%p*B[n-i]%p);
f[i]=j;
}
puts("-");
}
return0;
}
相关文章推荐
- UVAlive 5798 Jupiter Atacks!(树状数组)
- UVAlive5798 Jupiter Atacks!
- UVALive 5798 Jupiter Atacks!(线段树)
- 5798 - Jupiter Atacks!
- [UVALive4329] Ping pong(树状数组,组合)
- UVA 1513 - Movie collection(树状数组)
- UVALive 2191 - Potentiometers (树状数组)
- UVA 501 - Black Box(二分 + 树状数组 + 离散化)
- UVALive 4329 Ping pong(解法二:树状数组)
- UVA 10869 - Brownie Points II(树状数组)
- UVA1406 - A Sequence of Numbers(树状数组)
- UVA 12086 - Potentiometers(树状数组)
- 5798 - Jupiter Atacks!
- uvalive 4329 Ping Pong(树状数组)
- UVA1428 - Ping pong(树状数组)
- UVa 1513 Movie collection (树状数组)
- UVA 12086 Potentiometers(树状数组|| 线段树单点更新)
- UVA 1428 || LA 4329 PingPang (树状数组)
- UVA 11423 - Cache Simulator (树状数组)
- UVA 1513-Movie collection(树状数组)