題意:
給定乙個長度為n的序列a,常數p和c。你需要支援m次操作,分為兩種:
$n,m\leq 50000,c題解:
一般像這種看起來根本沒法維護的線段樹題都是操作幾次就變常數了,於是我們考慮一下這個操作的性質。
首先引入拓展尤拉定理:
$a^\ mod\ p=\begina^,b
注意到$\phi^(p)$在$k=30$左右的時候就會變成1,而任何數對1取模都等於0。
也就是說,當某個位置i被操作k次之後,它初始的$a_$會因為對1取模而消失掉。
那麼當乙個區間被操作k次之後,它包含的所有$a_$都是同乙個值,且無論再操作多少次都還是這個值。
所以我們只需要預處理出每個位置操作k次之內的答案,對於一次修改,我們暴力遞迴修改次數小於k的區間即可。
(注意不能對於一次查詢暴力遞迴,可能會出現沒有修改只有查詢的情況)
每個區間最多被暴力更新k次,所以線段樹的複雜度不會超過$o(n\logk)$,其中k是$\log$級別的。
但是預處理複雜度是$o(nk^)$的,瓶頸在於快速冪。
這裡面有乙個小技巧:利用bsgs的思想預處理出$0\leq i<10000,c^$的值和$0\leq i<10000,c^$的值,兩邊拼一下即可。
在快速冪裡還需要判斷一下指數b是否小於$\phi(p)$,注意到$2^}}}$肯定已經超過p了,所以只在5以內判一下即可,不會爆longlong。
但最後幾個尤拉函式在p很大時貌似都等於$2^$,所以直接在返回值等於0的時候返回$\phi(i)$也能過。
總複雜度$o(n\log^)$。
套路:**:
#include#define maxn 200005相逢是問候#define maxm 10000
#define inf 0x7fffffff
#define ll long long
#define rint register ll
#define debug(x) cerr<
namespace
std;
ll mod,a[maxn][
50],phi[maxn];
ll bs[
50][maxn],gs[50
][maxn];
ll pri[maxn],ish[maxn];
inline ll read()
struct
segment
ll mid=l+r>>1
; build(l,mid,k
<<1),build(mid+1,r,k<<1|1
); mn[k]=min(mn[k<<1],mn[k<<1|1
]); sum[k]=(sum[k<<1]+sum[k<<1|1])%mod;
}inline
void
pushdown(ll k)
}inline
void
force(ll l,ll r,ll k)
if(l==r)
pushdown(k); ll mid=l+r>>1
; force(l,mid,k
<<1),force(mid+1,r,k<<1|1
); sum[k]=(sum[k<<1]+sum[k<<1|1])%mod;
}inline
void
upd(ll x,ll y,ll l,ll r,ll k)
pushdown(k); ll mid=l+r>>1
;
if(x<=mid) upd(x,y,l,mid,k<<1
);
if(y>mid) upd(x,y,mid+1,r,k<<1|1
); mn[k]=min(mn[k<<1],mn[k<<1|1
]); sum[k]=(sum[k<<1]+sum[k<<1|1])%mod;
}inline ll qry(ll x,ll y,ll l,ll r,ll k)
}tr;
inline ll pw(ll a,ll b,ll mo)
inline ll pwp(ll mo,ll b)
inline
void
init(ll x)
}}inline
void
init(ll p)
ll x=p,res=p;
for(ll i=1;i<=pri[0];i++)
if(x%pri[i]==0
)
if(x>1) res=(res-res/x);
init(res);
}inline ll solve(ll a,ll t,ll end)
intmain()
for(ll i=1;i<=n;i++)
//fgx;
tr.build(1,n,1
);
while(m--)
return0;
}
六省聯考2017 相逢是問候 題解
安利 雜題選做 洛谷 p3747 六省聯考2017 相逢是問候 首先可以想到通過尤拉定理計算 不難發現只有前 log 次修改是有用的 那麼直接維護就可以了 注意不要每次計算的時候直接呼叫快速冪 這樣會多乙個 log.正確的姿勢是對於每個 mod o sqrt 預處理一下 c x 和 c 然後就可以做...
題解 六省聯考2017 相逢是問候
luogu loj維護乙個序列,支援區間求和,以及將區間內每乙個數 a i 變成 c c為給定的常數 並要求結果對 p 取模 p 不一定是質數 數列元素個數 n leq 10 5 操作次數 m leq 10 5 1 leq c p leq 10 8 注 以下稱 將區間內每乙個數 a i 變成 c 為...
SHOI 2017 相逢是問候
loj 2142 相逢是問候 首先 這道題目很輕易地就能想到用線段樹求和 但是題目的難點在於 ca imodp caimod pmodp 解決這個問題的公式是 ab abmod p b ai p modp 根據這個公式逆推一下 ca imodp caimod p ai p p modp 以下簡寫 b...