組合數模p

2021-07-02 03:34:31 字數 1199 閱讀 6972

求c(n,m)%p,p為質數

1. 1=< n< =109

,1=< m< =105

,1=< p< =109

解法:尤拉定理法求逆

複雜度:o(m*logp)

ll power(ll a,ll b,ll p)

else

}return ans;

}ll ni(ll a,ll p)

ll c(ll n,ll m,ll p)

return ans;

}

2.1<=n,m<=109

,1<=p<=105

,1<=cas<=105

每組詢問n,m,p均不同!

解法:

1.預處理factorial[i][j]:j!%第i個質數—o(p*π(p))

2.利用lucus定理求c(n,m)%p—o(logm*logp)

3.共t組資料,總複雜度o(p*π(p)+t*logm*logp)

注:這種預處理方式耗費大量空間和時間,在p很小的時候才能採用

ll biao[maxn];

bool not_prime[maxn];

vectorprime;

ll factorial[maxn][maxn];

void init()

}//預處理所有的階乘j!%p[i]:存入factorial[i][j]中

for(ll i=0;i0]=1;

biao[prime[i]]=i;

for(ll j=1;j<=prime[i];j++)

}}ll power(ll a,ll b,ll p)

else

}return ans;

}ll ni(ll a,ll p)

ll c(ll n,ll m,ll p)

ll lucus(ll n,ll m,ll p)

return ans;

}

3.1<=n,m<=105

,p<=109

,且p固定。

解法:1.預處理factorial[n]=n!

%p—o(n),及invf[n]:n!

%p的逆元—o(n*logp)

2.則c(n,m)=factorial[n]*inv[m]*inv[n-m]—o(1)

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...

P2822 組合數問題

題目描述 組合數c n mc n m 表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 c n m m n m n 其中n 1 2 n 不清楚不要怪我,暫時找...

P2822 組合數問題

小蔥想知道如果給定 n,m 和 k,對於所有的 0 i n,0 j min i,m 有多少對 i,j i,j 滿足 ci取j 是 k 的倍數。輸入格式 第一行有兩個整數 t,kt,k,其中 tt 代表該測試點總共有多少組測試資料,k 的意義見問題描述。接下來 tt 行每行兩個整數 n,m,其中 n,...