六省聯考2017 相逢是問候 題解

2022-03-10 20:52:41 字數 1404 閱讀 8096

安利\(:\)

雜題選做

洛谷 p3747 [六省聯考2017]相逢是問候

首先可以想到通過尤拉定理計算\(.\)

不難發現只有前\(log\)次修改是有用的\(,\)那麼直接維護就可以了\(.\)

注意不要每次計算的時候直接呼叫快速冪\(,\)這樣會多乙個\(\log.\)

正確的姿勢是對於每個\(mod\)

\(o(\sqrt)\)預處理一下\(c^x\)和\(c^\)

\(,\)然後就可以做到\(o(1)\)計算乙個\(c^x.\)

實現的好可以做到\(o(nlog^2max(p,n))\)

**\(:\)

#include #define ll long long

using namespace std;

const int n = 50005,d = 60;

inline int calcphi(int n)

if (t > 1) ans = ans / t * (t-1);

return ans;

}int p;

int c;

int p[d],cntp,c1[d][1<<15],c2[d][1<<15];

inline int mo(ll n,int p)

inline void init_c()

}inline int power(int n,int i)

int n,m,a[n][d];

inline int calc(int x,int cnt,int i)

int sum[n<<2],mn[n<<2];

inline void up(int o)

inline void build(int o,int l,int r)

int mid = l+r>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r); up(o);

}int ll,rr;

inline void add(int o,int l,int r)

if (ll <= l && rr >= r)

int mid = l+r>>1; if (ll <= mid) add(o<<1,l,mid); if (rr > mid) add(o<<1|1,mid+1,r); up(o);

}int qans;

inline void ask(int o,int l,int r)

int mid = l+r>>1; if (ll <= mid) ask(o<<1,l,mid); if (rr > mid) ask(o<<1|1,mid+1,r);

}int main()

build(1,1,n);

while (m--)

return 0;

}

題解 六省聯考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 為...

六省聯考2017 相逢是問候

題意 給定乙個長度為n的序列a,常數p和c。你需要支援m次操作,分為兩種 n,m leq 50000,c題解 一般像這種看起來根本沒法維護的線段樹題都是操作幾次就變常數了,於是我們考慮一下這個操作的性質。首先引入拓展尤拉定理 a mod p begina b 注意到 phi p 在 k 30 左右的...

SHOI 2017 相逢是問候

loj 2142 相逢是問候 首先 這道題目很輕易地就能想到用線段樹求和 但是題目的難點在於 ca imodp caimod pmodp 解決這個問題的公式是 ab abmod p b ai p modp 根據這個公式逆推一下 ca imodp caimod p ai p p modp 以下簡寫 b...