日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

uvalive5798(树状数组)

發(fā)布時(shí)間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uvalive5798(树状数组) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意:

單點(diǎn)更新,區(qū)間求和,求和操作和普通的求和不一樣,如果我們要求2~5的和,sum=1*f[5]+b*f[4]+b*b*f[3]+b*b*b*f[2],輸出每個(gè)詢(xún)問(wèn)操作的答案,同時(shí)答案要模p。


思路:
我們可以在操作的時(shí)候直接給每個(gè)位置的數(shù)字成上b的多少次冪,例如如果是五個(gè)數(shù)字,我們插入f1時(shí),我們不插入f1,而是插入f1*b*b*b*b,插入f2時(shí),我們插入f2*b*b*b,這樣,詢(xún)問(wèn)的時(shí)候我們就可以直接區(qū)間求和,再除以一個(gè)b的多少次冪。同時(shí)要注意,除法取模要求逆元,計(jì)算b的次冪的時(shí)候要用快速冪,被紅書(shū)的快速冪坑了。。。它的那個(gè)取模不夠徹底。


代碼:

#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;//無(wú)最大公約數(shù) 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; }

總結(jié)

以上是生活随笔為你收集整理的uvalive5798(树状数组)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。