日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)

發布時間:2024/4/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
禮物
  • 題意:
    • \[C(n,m)\ \%\ p\]
    • \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),則\(\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\)
  • 注意到若\[p=\prod_{i=1}^{k}{p_i}^{c_i},則\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\]

  • 于是有一個經典套路就是,求出\(k\)\(A_i=C(n,m)\% {p_i}^{c_i}\),最后用中國剩余定理求解.

  • 注意到若中國剩余定理求出一組特解為\(Ans\),則\((Ans+kp)\)為其通解.

  • 由于\(p\)不保證為質數,所以我們需要對\(C(n,m)\)拆式子,然后把含\(p\)的與不含\(p\)的質因子分開算.

  • 于是問題轉化為求\(n!\),我們以\(p^c\)個數為一組,不難發現,把含\(p\)質因子的數篩出去后每一組的乘積在模\(p^c\)意義下是一樣的.

  • 這個證明很顯然,因為每一組都可以表示為\((k*p^c+1,k*p^c+2,\cdots,(k+1)*p^c)\).

  • 于是發現含有\(p\)的質因子又是一個階乘.

  • 所以分治處理.

  • 注意這里對于模數非質數的求逆元方法:

  • 我們要求\(x\)關于\(m\)的逆元,實質上就是\(ax + km = 1\)的解.

  • 然后我們可以求得這個\(a\),用拓展\(gcd\)即可.

ll Exgcd(L a, L b, L &x, L &y) {if (!b) { x = 1, y = 0; return a; }L d = Exgcd(b, a % b, x, y), z = x;x = y, y = z - y * (a / b); return d; } //拓歐ll CALC(L st, L en, L k) { L s = 1;F(i, st, en) if (i % sta[k].p) s = (s * i) % sta[k].up;return s; }ll calc(L n, L k) {if (n <= sta[k].p) return CALC(1, n, k);L k1 = calc(n / sta[k].p, k); //分治求解L k2 = CALC(1, min(sta[k].up - 1, n), k); //每sta[k].up個分一組,這是一個循環節if (n > sta[k].up) {L k3 = CALC((n / sta[k].up) * sta[k].up + 1, n, k); //計算循環節余剩的return (k1 * ksm(k2, n / sta[k].up, sta[k].up) * k3) % sta[k].up;}else return (k1 * k2) % sta[k].up; }ll count(L n, L p) { return n < p ? 0 : n / p + count(n / p, p); } //分治計算含p質因子個數ll Inv(L t, L p) {L d, x, y; d = Exgcd(t, p, x, y); //求逆元return (x % p + p) % p; }ll C(L x, L y) {L ss = 0;F(i, 1, cnt) {L s1 = calc(x, i), s2 = (calc(y, i) * calc(x - y, i)) % sta[i].up, tot; //計算x!/y!(x-y)!s1 = s1 * Inv(s2, sta[i].up) % sta[i].up; //與sta[i].up互質,所以用拓歐求逆元.tot = count(x, sta[i].p) - count(y, sta[i].p) - count(x - y, sta[i].p); //計算含p質因子個數s1 = s1 * ksm(sta[i].p, tot, sta[i].up) % sta[i].up; //快速冪一下G[i] = {s1, sta[i].up}; //一組方程}F(i, 1, cnt) {L Mi = p / sta[i].up;ss = (ss + ((G[i].a * Mi % p) * Inv(Mi, G[i].mo))) % p; //構造一組特解}return ss == 0 ? p : (ss % p + p) % p; //通解 }
  • 此題是很好的思維+數論模板題.

轉載于:https://www.cnblogs.com/Pro-king/p/9383516.html

總結

以上是生活随笔為你收集整理的礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。