description
組合數c(n,m)表示的是從n個物品中選出m個物品的方案數。舉個例子,從(1,2,3)三個物品中選擇兩個物品可以有(input1,2),(1,3),(2,3)這三種選擇方法。根據組合數的定義,我們可以給出計算組合數c(n,m)的一般公式:
c(n,m)=n!/m!*(n?m)! 其中n!=1×2×?×n。(額外的,當n=0時,n!=1)
小蔥想知道如果給定n,m和k,對於所有的0≤i≤n,0≤j≤min(i,m)有多少對(i,j)滿足c(i,j)是k的倍數。
第一行有兩個整數t,k,其中t代表該測試點總共有多少組測試資料,k的意義見。 接下來t行每行兩個整數n,m,其中n,m的意義見。output
t行,每行乙個整數代表所有的0≤i≤n,0≤j≤min(i,m)中有多少對(i,j))滿足c(i,j)是k的倍數sample input答案對10^9+7取模。
3 23sample output hint23333333 23333333
233333333 233333333
2333333333 2333333333
1≤n,m≤10^18,1≤t,k≤100,且 k 是乙個質數』題解
個個都說很顯然我辣雞當然不覺得考慮lucas定理 cm
n=cm
/pn/
p∗cm
modp
nmodp(
modp
) cnm
=cn/
pm/p
∗c
nmodpm
modp
(modp)
這裡p就等於k了嘛..
其實就相當於把n,m寫成p進製,設b1[u]表示n在p進製下的第u位,b2[u]表示m在p進製下的第u位
如果有至少一位i使得b1[i] < b2[i]
那麼這個數mod p是為0的
於是就可以愉快數字dp了
實現怎麼這麼複雜啊..
#include
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const ll mod=1e9+7;
int t,k;ll n,m,ans;
int s1[1100],s2[1100],ln1,ln2;
void get(ll u,int op)
else
}ll pow_mod(ll a,ll b)
return ret;
}void ad(ll &x,ll y)
ll f[70][2][2][2][2];
ll dp(int p,int op1,int op2,int op3,int op4)//位置 是否卡上界 是否出現第乙個m比n大的數 是否出現第乙個m比n小的數
if(s1[p]1,1,0,op3,0));
for(int j=s1[p]+1;j1,1,0,op3,1));
if(s1[p]1,1,1,op3,1));
else
if(s1[p]==s2[p])ad(ret,dp(p-1,1,1,op3,0));
return f[p][op1][op2][op3][op4]=ret;
}else
//n不限制
if(s1[p]1,1,0,op3,0));
for(int j=s1[p]+1;j1,1,0,op3,1));
return f[p][op1][op2][op3][op4]=ret;}}
else
//m不限制
return f[p][op1][op2][op3][op4]=ret;
}else
//n不限制
return f[p][op1][op2][op3][op4]=ret;}}
}else
}int main()
return
0;}
BZOJ 2142 禮物 組合數學 數論
題目大意 給定n個物品,分給m個人,每個人拿到wi個禮物,問方案數mod pp不一定為質數 首先我們把剩下的禮物也分給乙個人 答案明顯不變 w m n w1 w2 wm 然後就會很方便地得到公式 ans c n,w1 c n w1,w2 c n w1 w2,w3 c n w1 w2 w m 1 wm...
方程(1)(數論 組合數)
description 求關於x1,x2,xn 的方程 x1 x2 xn k 的非負整數解的個數。input 僅一行,包含 個正整數n,k。output 乙個整數,表示方程不同解的個數,這個數可能很大,你只需輸出mod 20080814的結果。分析 這其實是乙個組合數的模型 有n種元素,每種元素可不...
組合數取模 數論
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 time limit 1 sec memory limit 128 mb submit 113 solved 39 submit status web board 給出n,m,p,求c n,m mod p 1 m n 10 6,1 p 1...