BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】
2018-07-05 10:07
381 查看
题目链接
题解
\[ans = \sum\limits_{i = 0}^{\infty}{nk \choose ik + r} \pmod p\]
发现实际是求
\[ans = \sum\limits_{i = 0}^{\infty}{nk \choose i}[i \mod k = r] \pmod p\]
设\(f[i][j]\)表示\(i\)个数选出\(x \mod k = j\)个数的方案数
利用组合数递推 + 矩乘转移即可
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<map> #define LL long long int #define REP(i,n) for (int i = 1; i <= (n); i++) #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define cls(s,v) memset(s,v,sizeof(s)) #define mp(a,b) make_pair<int,int>(a,b) #define cp pair<int,int> using namespace std; const int maxn = 55,maxm = 100005,INF = 0x3f3f3f3f; inline int read(){ int out = 0,flag = 1; char c = getchar(); while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();} while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();} return flag ? out : -out; } int n,r,K,P; struct Matrix{ int s[maxn][maxn],n,m; Matrix(){cls(s,0);n = m = 0;} }A,F0,F; inline Matrix operator *(const Matrix& a,const Matrix& b){ Matrix c; if (a.m != b.n) return c; c.n = a.n; c.m = b.m; for (int i = 0; i < c.n; i++) for (int j = 0; j < c.m; j++) for (int k = 0; k < a.m; k++) c.s[i][j] = (c.s[i][j] + 1ll * a.s[i][k] * b.s[k][j] % P) % P; return c; } inline Matrix qpow(Matrix a,LL b){ Matrix re; re.n = re.m = a.n; for (int i = 0; i < re.n; i++) re.s[i][i] = 1; for (; b; b >>= 1,a = a * a) if (b & 1) re = re * a; return re; } int main(){ n = read(); P = read(); K = read(); r = read(); F0.n = K; F0.m = 1; F0.s[0][0] = 1; A.n = A.m = K; for (int j = 0; j < K; j++){ A.s[j][j]++; A.s[j][(j - 1 + K) % K]++; } F = qpow(A,1ll * n * K) * F0; printf("%d\n",F.s[r][0]); return 0; }
相关文章推荐
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
- 【jzoj5215】【BZOJ4870】【Shoi2017】【GDOI2018模拟7.9】【组合数问题】【矩阵快速幂】
- bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]
- BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法
- bzoj4870 [Shoi2017]组合数问题
- 【BZOJ4870】【SHOI2017】组合数问题
- [BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘
- BZOJ4870: [Shoi2017]组合数问题
- 【BZOJ4870】[Shoi2017]组合数问题 动态规划(矩阵乘法)
- bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)
- BZOJ4870:[SHOI2017]组合数问题——题解
- [DP 倍增] BZOJ 4870 [Shoi2017]组合数问题
- [bzoj4870] [Shoi2017]组合数问题
- bzoj 4870: [Shoi2017]组合数问题
- BZOJ 4870 [Shoi2017] 组合数问题
- BZOJ4870: [Shoi2017]组合数问题
- bzoj4870 [Shoi2017]组合数问题(dp+矩阵倍增)
- BZOJ 4870: [Shoi2017]组合数问题 (递推+矩阵快速幂)
- BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法
- bzoj 4870: [Shoi2017]组合数问题 动态规划