zoukankan      html  css  js  c++  java
  • BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】

    题目链接

    BZOJ4870

    题解

    [ans = sumlimits_{i = 0}^{infty}{nk choose ik + r} pmod p ]

    发现实际是求

    [ans = sumlimits_{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
    ",F.s[r][0]);
    	return 0;
    }
    
    
  • 相关阅读:
    JMX堆栈分析
    Python装饰器示例
    安装指定版本capistrano
    Linux CPU使用率含义及原理
    API gateway 之 kong 安装
    Redis内存分析方法
    Elasticsearch集群内的原理
    Elasticsearch基础
    Python智能检测编码并转码
    (转)rabbitmq的web管理界面无法使用guest用户登录
  • 原文地址:https://www.cnblogs.com/Mychael/p/9266814.html
Copyright © 2011-2022 走看看