• 花园


    【代码】

    #include<bits/stdc++.h>
    
    #define LL long long
    
    using namespace std;
    const int M = 5, p = 1000000007;
    LL n, m, k, ans = 0;
    LL f[1 << M], a[1 << M][1 << M];
    int MAX, cnt;
    bool pd[1 << M];
    inline void mulself(LL a[1 << M][1 << M]) {
    	LL c[1 << M][1 << M];
    	memset(c, 0, sizeof c);
    	for(int i = 0; i < MAX; ++i)
    		for(int j = 0; j < MAX; ++j)
    			for(int k = 0; k < MAX; ++k)
    				c[i][j] = (c[i][j] + a[i][k] * a[k][j]) % p;
    	memmove(a, c, sizeof c);
    }
    inline void mul(LL f[1 << M], LL a[1 << M][1 << M]) {
    	LL c[1 << M];
    	memset(c, 0, sizeof c);
    	for(int j = 0; j < MAX; ++j)
    		for(int k = 0; k < MAX; ++k)
    			c[j] = (c[j] + f[k] * a[k][j]) % p;
    	memmove(f, c, sizeof c);
    }
    int main() {
    	scanf("%lld%lld%lld", &n, &m, &k);
    	MAX = 1 << m;
    	for(int i = 0; i < MAX; ++i) {
    		cnt = 0;
    		for(int j = 0; j < m; ++j)
    			if(i & 1 << j) ++cnt;
    		if(cnt <= k) pd[i] = true;
    	}
    	for(int i = 0; i < MAX; ++i)
    		if(pd[i]) {
    			memset(f, 0, sizeof f);f[i] = 1;
    			memset(a, 0, sizeof a);
    			for(int j = 0; j < MAX; ++j) if(pd[j]){
    				a[j >> 1][j] = 1;
    				a[(j >> 1) + (1 << (m - 1))][j] = 1;
    			}
    			for(LL y = n; y; y >>= 1, mulself(a))
    				if(y & 1)
    					mul(f,a);
    			ans = (ans + f[i]) % p;
    		}
    	printf("%lld
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    数据库事务的四大特性以及事务的隔离级别
    informer使用示例
    Linux内存、Swap、Cache、Buffer详细解析
    浏览器访问百度的整个过程
    安装zookeeper
    配置java环境
    promethues开发
    go mod常用操作说明
    redis使用基础
    channel的声明和使用
  • 原文地址:https://www.cnblogs.com/kcfzyhq/p/8653746.html
Copyright © 2020-2023  润新知