題面
式子看起來很嚇人哈
不過我們來考慮它的實際意義
就是在 nk 個物品中選擇 模k餘數為r 的方案數和
設 \(f[i,j]\) 表示選 在 i 個物品中選擇 模k餘數為j 的方案數和
容易得到 \(f[i,j]=f[i-1,j-1]+f[i-1,j]\)
當然,為了避免負數,我們寫成這種模樣 \(f[i,j]=f[i-1,(j+k-1)\%k]+f[i-1,j]\)
這種形式可以寫成矩陣
然後就矩陣快速冪 啦啦啦啦
當然,我們可以繼續優化
發現這個式子也可以不由 i-1轉移過來,而是由兩個狀態合併而來
\(f[x+y,k]=f[x,0]f[y,k]+f[x,1]f[y,k-1]...f[x,k]f[y,0]\)
然後可以dp快速冪了
然後說如果p特殊,可以用單位根反演?(%%%boshi)
就只上第一種做法的**吧(準確來說我只會這一種)
注意當k=1時,矩陣會退化為單個變數,用賦值的方法會掛;應該自加
#includeusing namespace std;
#define int long long
int const maxn=60;
int n,p,k,r;
struct mat
mat operator*(const mat& b) const
}} return x;
} void init()
x=ans;
}signed main()
mpow(b,n*k);
a=b*a;
printf("%lld\n",a.m[r][0]);
return 0;
}
Luogu P3746組合數問題(矩陣)
題目鏈結 哇我乙個活人的智商被題目碾壓了 可以把問題轉化為有nk個物品,問拿i件物品的方案數有多少種,其中i k r。然後矩陣乘法加速dp即可。include include include include include define maxn 55 using namespace std inl...
洛谷3746 六省聯考2017 組合數問題
組合數 cnmc n mc n m 表示的是從 n 個互不相同的物品中選出 m 個物品的方案數。舉個例子,從 1 2 3 三個物品中選擇兩個物品可以有 1 2 1 3 2 3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 cnmc n mc n m 的一般公式 cnm n m n m c...
題解 NOIP2016 組合數問題
組合數 表示的是從 n個物品中選出 m個物品的方案數。舉個例子,從 1,2,3 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 1,2 1,3 2,3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 的一般公式 frac 其中 特別地,定義 0 10 1 小蔥想知道如果給...