BZOJ4869 相逢是問候 線段樹 尤拉定理

2021-09-30 14:35:53 字數 1876 閱讀 5255

直接上傳送門: bzoj4869 相逢是問候

題意:維護數列區間和,帶有將原數a[i]修改為ca

[i] 的操作

演算法:線段樹+tex尤拉定理

思路:當

c>φ(

p)時下式成立 cx

≡cx%

φ(p)

+φ(p

)(mo

dp)

證明%大佬

微小的尤拉定理ext證明

若我們對乙個值x反覆進行該操作,簡單來看過程如下: cc

x≡cc

x%φ(

p)+φ

(p)≡

ccx%

φ(p)

∗cφ(

p)(m

odp)

ccx%φ(p

)∗cφ

(p)≡

ccx%

φ(φ(

p))+

φ(φ(

p))∗

cφ(p

)≡cc

x%φ(

φ(p)

)∗cφ

(φ(p

))∗c

φ(p)

(mod

p)而像這樣遞迴呼叫尤拉函式lo

g(p)

次後能夠使它最終變成1,操作就不難了。

安利小夥伴的

題解!

select code

#include

using

namespace

std;

typedef

long

long ll;

const

int sm = 5e4+10;

const

int sn = 2e5+10;

const

int mx = 1e4+5;

int n,m,c,p,k;

int a[sm],s[sn],tag[sn];

int ph,p[30];

int pr[mx+10],np[mx+10];

int min(int x,int y)

void prepare()

}}int phi(int x)

if(x>1)ph=ph-ph/x;

return ph;

}void pushup(int x)

void build(int i,int l,int r)

int m=(l+r)>>1;

build(i<<1,l,m);

build(i<<1|1,m+1,r);

pushup(i);

}int q_pow(int a,int b,int mod,int &flag)

//(ll)(ans*a>=mod)判斷當前結果在模之前是否大於模數

if((ll)a*a>=mod)big=1;//任意乙個因子大於模數

a=(ll)a*a%mod,b>>=1;

}return ans;

}int calc(int x,int dep)

return ret%p[0];

} void modify(int i,int l,int r,int aa,int b)

int m=(l+r)>>1;

if(aa<=m) modify(i<<1,l,m,aa,b);

if(b > m) modify(i<<1|1,m+1,r,aa,b);

pushup(i);

}int query(int i,int l,int r,int a,int b)

int main()

return

0;}

BZOJ4869 相逢是問候(線段樹,尤拉定理)

bzoj 根據尤拉定理遞迴計算 類似上帝與集合的正確用法 所以我們可以用線段樹維護區間最少的被更新的多少次 如果超過了 的限制 就不用再計算了 如果需要計算就每次暴力算 這樣的複雜度o nlog 2 include include include include include include in...

BZOJ4869 相逢是問候(線段樹,尤拉定理)

bzoj 根據尤拉定理遞迴計算 類似上帝與集合的正確用法 所以我們可以用線段樹維護區間最少的被更新的多少次 如果超過了 varphi 的限制 就不用再計算了 如果需要計算就每次暴力算 這樣的複雜度 o nlog 2 include include include include include in...

4869 Shoi2017 相逢是問候

4869 shoi2017 相逢是問候 time limit 40 sec memory limit 512 mb submit 440 solved 124 submit status discuss description informatikverbindetdichundmich.資訊將你我...