組合數取模深度解析

2021-06-17 20:17:07 字數 4221 閱讀 2921

分類: 數論

2013-02-13 15:47

63人閱讀收藏 

舉報今天我們來討論如何求:c(n,m)%p

首先如果n,m,p的範圍均為[1,1000],那麼我們完全可以用兩個迴圈搞定,

c(n,m)=(c(n-1,m)%p+c(n-1,m-1)%p)%p。

但是如果n,m,p的範圍均為[1,10^9],另外p為素數,則完全可以用lucas

定理搞定。

如果n,m,p範圍還是[1,10^9],另外p如果為合數,則我們可以先把p分解:

p=p1^a1*p2^a2*...*pk^ak。

問題主要轉化為如何求c(n,m)%(p^c)  其中p為素數。

求完直接合併乙個模方程即可。p^c 的規模大約是10^5。

c 不是1,lucas阻止不了它。

n,m太大,因子分解也阻止不了它。

下面介紹一種好方法:

假設 p = 3, c = 2,也就是mod 9,

假設n = 19,

n! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * …… * 19

要是可以快速得到 n! 中除掉3 以後 mod 9的結果,那麼多好呀!

看3多討厭,直接砍fac( int n) :

n! = [ 1 * 2 * 4 * 5 * 7 * 8 * …  * 16 * 17 * 19 ] * (3 * 6 * 9 * 12 * 15 * 18)=

[ 1 * 2 * 4 * 5 * 7 * 8 * …  * 16 * 17* 19 ] * 3^6*( 1 * 2 * 3 * 4 * 5 * 6)

然後發現後面的一坨實際上是 fac( n / p) ,

再看前半部分,尼瑪是以 p^c 為週期的啊!!!

[1 * 2 * 4 * 5 * 7 * 8 ] = [10 * 11 * 13 * 14 * 16 *17 ] = (mod 9),

於是說白了,對於前面的部分,由於週期,都是浮雲了,

下面是 孤立出來的19

可以知道孤立出來的 長度不超過 p^c ,於是暴力啊,暴力啊!

於是完美解決n! 中和 p無關的項 mod p^c的值!!!

接下來是分母部分,一模一樣,無非多了乙個求逆元(因為都和p沒關係了,逆元必

然存在)

我們來分析一下,這樣的複雜度是如何的呢,

每次遞迴,規模變為原來的 1/p,

logp n的啊!!!

當然是層數= =

於是問題完美解決

[cpp]view plain

copy

#include 

#define ll long long

ll p,k,r,x,y;  

void

extend_euclid(ll a,ll b)  

extend_euclid(b,a%b);  

ll temp=x;  

x=y;  

y=temp-(a/b)*y;  

}  ll quick_mod(ll a,ll b,ll m)  

b>>=1;  

a=a*a%m;  

}  return

ans;  

}  ll multi(ll p,ll k)  

ll sum(ll n)  

return

ans;  

}  ll solve(ll n)  

ll ret=quick_mod(ans1,n/r,r);  

ll x=n-n%r+1;  

ll ans2=1;  

for(i=x;i<=n;i++)  

ret=ret*ans2%r*solve(n/p)%r;  

return

ret;  

}  int

main()  

return

0;  

}  

petr在codeforces上給世界級選手出的10道難題2 :

輸出c(n,k)的最後10位,0<=k<=n<=10^18,n>=1

分類: 數論

2013-02-24 18:15

66人閱讀收藏 

舉報題目:ipad,iphone ac大神的題目

對於這個題我們首先得知道二次剩餘的乙個結論,就是如果p為奇素數,a為p的二次剩餘,那麼有a^((p-1)/2)=1(mod p),

如果a為p的二次非剩餘,則a^((p-1)/2)=-1(mod p),如果為非剩餘則答案直接為0,否則前面那兩坨為4,只需考慮後面的,後面的用矩陣構造。

在降冪的時候注意必須是a和b都為p的二次剩餘時才可以,否則就錯誤。還有在p已經為素數的情況下,對於a^bmod p 那麼當b大於p-1時

a^(b%(p-1))%p與a^(b%(p-1)+p-1)%p是一樣的結果。

組合數取模

複習了一下組合數取模,當然推薦檢視acdreamer的部落格啦,寫的確實好啦,自己把裡面的題目全a掉了。include include include include include include include using namespace std typedef long long ll l...

組合數取模

對於c n,m mod p。這裡的n,m,p p為素數 都很大的情況。就不能再用c n,m c n 1,m c n 1,m 1 的公式遞推了。這裡用到lusac定理 for non negative integers m and n and a prime p,the following congr...

組合數取模

組合數c m,n 表示在m個不同的元素中取出n個元素 不要求有序 產生的方案數。定義式 c m,n m n m n 並不會使用latex qaq 根據題目中對組合數的需要,有不同的計算方法。運用乙個數學上的組合恒等式 oi中稱之為楊輝三角 c m,n c m 1,n 1 c m 1,n 證明 1.直...