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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3934-Nephren Ruq Insania【欧拉定理,树状数组】

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3934-Nephren Ruq Insania【欧拉定理,树状数组】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.org/problemnew/show/P3934


題目大意

長度為nnn的序列aaa

  • 1lrw:1\ l\ r\ w:1?l?r?w:l~rl\sim rlr這個區間增加www
  • 2lrp:2\ l\ r\ p:2?l?r?p:alal+1al+2...%pa_l^{a_{l+1}^{a_{l+2}^{...}}}\% palal+1al+2...???%p直到ara_rar?

  • 解題思路

    根據歐拉定理
    ab%p={ab(b&lt;φ(p))ab%φ(p)+φ(p)(b≥φ(p))a^b\%p=\left\{\begin{matrix} a^b(b&lt;\varphi(p)) \\ a^{b\%\varphi(p)+\varphi(p)}(b\geq \varphi(p)) \\ \end{matrix}\right.ab%p={ab(b<φ(p))ab%φ(p)+φ(p)(bφ(p))?
    所以我們可以使用遞推求詢問,然后因為有兩種情況所以我們需要開一個結構體儲存值和是否需要+φ(p)+\varphi(p)+φ(p)。然后我們可以發現這樣子不斷遞推下去,最多推到log(p)log(p)log(p)層左右即可退出

    也就是φ(φ(φ(φ(φ(φ(...φ(p)))))))\varphi(\varphi(\varphi(\varphi(\varphi(\varphi(...\varphi(p)))))))φ(φ(φ(φ(φ(φ(...φ(p)))))))這樣子下去最多log(p)log(p)log(p)層左右φ\varphiφ就為1了,因為任何數%1=0\% 1=0%1=0所以再往后已經沒有必要了,所以詢問的時間復雜度是log(p)log(p)log(p)層左右就結束了。

    修改的話用樹狀數組維護就可以了。


    codecodecode

    #include<cstdio> #include<cstring> #include<algorithm> #define lobit(x) (x&-x) #define ll long long using namespace std; const ll N=501000,M=20000000; ll n,cnt,m,t[N],phi[M+100],pr[M+100]; bool v[M+100]; struct node{ll w,flag;node(ll _w=0,ll _flag=0){w=_w;flag=_flag;} }; void change(ll x,ll z) {while(x<=n){t[x]+=z;x+=lobit(x);} } ll ask(ll x) {ll sum=0;while(x){sum+=t[x];x-=lobit(x);}return sum; } void updata(ll l,ll r,ll x) {change(l,x);change(r+1,-x); } void Get_phi() {phi[1]=1;for(ll i=2;i<=20000000;i++){if(!v[i]){pr[++cnt]=i;phi[i]=i-1;}for(ll j=1;j<=cnt;j++){ll t=i*pr[j];if(t>20000000) break;v[t]=1;if(i%pr[j]==0){phi[t]=phi[i]*pr[j];break;}phi[t]=phi[i]*(pr[j]-1);}} } node power(ll x,ll b,ll p) {node ans=node(1,0);if(x>=p){x%=p;ans.flag=1;}while(b){if(b&1) ans.w=ans.w*x;if(ans.w>=p){ans.w%=p;ans.flag=1;}x=x*x;b>>=1;if(x>=p){ans.flag=1;x%=p;}}return ans; } node solve(ll l,ll r,ll p) {ll w=ask(l);node ans;if(p==1) return node(0,1);if(w==1) return node(1,0);if(l==r) return w<p?node(w,0):node(w%p,1);ans=solve(l+1,r,phi[p]);if(ans.flag) ans.w+=phi[p];return power(w,ans.w,p); } int main() {Get_phi();scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){ll w;scanf("%lld",&w);updata(i,i,w);}for(ll i=1;i<=m;i++){ll op,l,r,w;scanf("%lld%lld%lld%lld",&op,&l,&r,&w);if(op==1) updata(l,r,w);else{node ans=solve(l,r,w);printf("%lld\n",ans.w);}} }

    總結

    以上是生活随笔為你收集整理的P3934-Nephren Ruq Insania【欧拉定理,树状数组】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。