題解 洛谷6月月賽 數學 約數個數和

2022-02-27 13:04:31 字數 1237 閱讀 5564

看德國戰墨西哥去了結果發現比賽只剩下30分鐘……當然之後又思考這題挺久也還是不會做。看了一下題解,覺得這個做法挺厲害的,在這裡記錄一下:

原式實際上就是:(\(k += 1\)) \(\prod c\left ( a_ + k, a_ \right )\)    

為什麼是這樣呢?我們首先注意到,將原數因式分解了之後,每一位質因子取任意 \( <= a_\) 的數,組合起來都是乙個合法因數。我們將取出來的任意數看作是在進行選擇。那麼如果我在其中選擇了兩個數,我們可以看做是先選取了大的數。這樣就可以代表:對於含有\(p_^}\) 因子的約數而言,我們找到了乙個它的含有因子\(p_^}\)的約數。所以上面的式子就可以統計出乙個數的約數個數和的約數個數和的……

然後只需要考慮怎樣實現。首先篩掉1e6以內的素數。這樣的話,剩下的 \(n\) 可能的情況只有三種:\(p^, p * q, p\) 其中 \(p, q\) 均為質數。這裡運用的是miller_rabin。要保證正確性還應當加入二次探測~

#include using

namespace

std;

#define maxx (1e6 + 5)

#define maxn 1000020

#define ll long long

intpri[maxn], tot;

const

int p = 998244353

;int

m, inv[maxn], cnt[maxn];

ll n, k;

bitset

is_pri;

void

get_pri()

}}ll mul(ll x, ll times, ll p)

ll qpow(ll x, ll times, ll p)

intc(ll n, ll m)

intmain()

}if(n > 1

)

cnt[++ m] = 1

;

if(!tag) cnt[++ m] = 1

; }

}int ans = 1

;

for(int i = 1; i <= m; i ++)

ans = 1ll * ans * c(cnt[i] + k, cnt[i]) %p;

printf(

"%d\n

", ans);

return0;

}

洛谷7月月賽題解(2020)

醜話說在前面,我只寫了前三個的題解 因為有人告訴我第四題沒有價值!標題黨,廣大oier看了直呼內行!真就簽到題唄。反正就是把冪魔改成開根向下取個整。看 吧。int main 混,混凝土?擦汗 哎呀不就等腰三角形嗎,分類討論一手等腰和等邊,選取 1 2 len 1 的邊進行一下組合運算,就像我這樣的蒟...

洛谷 9月月賽

題目描述 眾所周知,在一些特殊的部門,如果密碼能夠讓乙個人就解開,就會非常不安全。pic pre invoked code,預生成密碼 誕生了。這個密碼比較安全,是因為它必須由三個人保管。系統首先預先生成三個大整數a b c,計算出它們的與and 或or 和sum並儲存,然後將a b c分別告訴這三...

洛谷5月月賽

n堆石子,每次可以從第i堆中取走乙個當且僅當ni ni 1 第0堆視作0個 拿不了就輸了。問先手贏還是後手贏。奇偶性問題。不管如何分布,必定全部被拿完。include inline char gc return s inline int read while c 0 c 9 return x f i...