直接上傳送門: 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.資訊將你我...