求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,...