點此看題
其實不一定是遞推問題才想矩陣加速,比如某個東西很大,但是某個東西很小的時候就可以嘗試矩陣乘法了。
這道題就用很小的量來定義狀態就行了,設 \(f(i,j)\) 表示考慮了 \(i\) 個數,選的總數模 \(k\) 是 \(j\),那麼每次就考慮這個數選還是不選,不難寫出轉移(第二維在模意義下):
\[f(i,j)=f(i-1,j)+f(i-1,j-1)
\]這個就很容易矩陣乘法了,時間複雜度 \(o(k^3\log(nk))\),注意考慮下 \(k=1\) 的情況。
還有乙個做法也是利用了快速冪去算這東西,只不過用的是多項式的快速冪。那麼如果我們要去套多項式快速冪怎麼辦呢?這就要求我們找到溝通組合數和多項式的橋梁了,這裡可以用二項式定理:
\[\begin
&=\sum_\\
&=\sum_[x^i](1+x)^\\
&=[x^r]((1+x)^\bmod (x^k-1))
\end
\]直接迴圈卷積快速冪,時間複雜度 \(o(k^2\log (nk))\),不會真的有人無聊到去寫多項式乘法吧。
#include const int m = 1005;
#define int long long
int read()
while(c>='0' && c<='9')
return x*f;
}int n,p,k,r,a[m],b[m],a[m],b[m];
void mul(int *a,int *b)
printf("%lld\n",b[r]);
}
六省聯考2017 組合數問題
六省聯考2017 組合數問題 寫數學題總是沒有思路,還是太菜了。題目大意 給定n,p,k,r,你要求的是 c nk,x p的值,其中x k r。n是1e9,k是50,p是1 2 32中任意乙個數,不保證為質數。這道題難在思路的轉化,如果你在思考怎麼快速求組合數,什麼o n 預處理,o 1 求組合數,...
洛谷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...
洛谷P3746 六省聯考2017 組合數問題
組合數 c n mcnm 表示的是從 n 個互不相同的物品中選出 m 個物品的方案數。舉個例子,從 1 2 3 三個物品中選擇兩個物品可以有 1 2 1 3 2 3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 c n mcnm 的一般公式 c n m fraccnm m n m n 其...