題解 lg3746 組合數問題

2022-03-06 12:53:19 字數 890 閱讀 9585

題面

式子看起來很嚇人哈

不過我們來考慮它的實際意義

就是在 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 小蔥想知道如果給...