bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]
4870: [Shoi2017]组合数问题
题意:求
\]
\(n \le 10^9, 0\le r < k \le 50\)
组合数推了一下,有一些有趣的性质但是并不好做
想到了从意义方面考虑,但是没有深入,去看了题解
n大k小,一副矩乘的样子
就是求“n个物品取模k余r个的方案数”
因为取的个数模k,变得很有意思,可以把组合数的递推式矩乘了...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
}
int n, mo, k, r;
struct matrix {
int a[51][51];
matrix() {memset(a, 0, sizeof(a));}
int* operator [](int x) {return a[x];}
} f, a;
matrix operator *(matrix a, matrix b) {
int n = k;
matrix c;
for(int i=0; i<n; i++)
for(int k=0; k<n; k++) if(a[i][k])
for(int j=0; j<n; j++) if(b[k][j])
c[i][j] = (c[i][j] + (ll) a[i][k] * b[k][j] %mo) %mo;
return c;
}
matrix operator ^(matrix a, ll b) {
int n = k;
matrix c;
for(int i=0; i<n; i++) c[i][i] = 1;
for(; b; b>>=1, a=a*a) if(b&1) c=c*a;
return c;
}
int Pow(ll a, int b) {
ll ans=1;
for(; b; b>>=1, a=a*a%mo)
if(b&1) ans=ans*a%mo;
return ans;
}
int main() {
freopen("in", "r", stdin);
n=read(); mo=read(); k=read(); r=read();
if(k == 1) {printf("%d", Pow(2, n)); return 0;}
for(int i=0; i<k; i++) f[i][i] = 1, f[(i+1)%k][i] = 1;
f = f ^ ((ll) n * k);
a[0][0] = 1;
a = f * a;
printf("%d\n", a[r][0]);
}
bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]的更多相关文章
- BZOJ 4870: [Shoi2017]组合数问题 矩阵乘法_递推
Code: #include <cstdio> #include <cstring> #include <algorithm> #define setIO(s) f ...
- 形态形成场(矩阵乘法优化dp)
形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法
注意到$r<k$ 别问我为什么要强调. 考场上前30分水水. 然后写阶乘的时候大力$n\log {n}$预处理 本机跑的挺快的,然后稳稳的T掉了. 然后就是简单的矩阵乘法了. #include ...
- 矩阵乘法优化DP复习
前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...
- 矩阵乘法优化DP
本文讲一下一些基本的矩阵优化DP的方法技巧. 定义三个矩阵A,B,C,其中行和列分别为$m\times n,n \times p,m\times p$,(其中行是从上往下数的,列是从左往右数的) $C ...
- 51nod 1583 犯罪计划——矩阵乘法优化dp
文泽想在埃及做案n次,并且想在最后不用得到惩罚.案件的被分成几种类型.比如说,案件A,当案件A被重复犯两次时,案件A将被认为不是犯罪案件,因此犯案人不用得到惩罚.也就是说,案件A被犯偶数次时,犯案人将 ...
- 【bzoj2476】战场的数目 矩阵乘法优化dp
题目描述 (战场定义为对于最高的一列向两边都严格不增的“用积木搭成”的图形) 输入 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周 ...
随机推荐
- Centos7安装docker-compse踩过的坑
一.概要 本文,我们介绍如何在centos7环境下安装docker-compose, 记录下安装过程步骤以及遇到的问题还有解决办法. 二.安装方式 1.官方安装方式 sudo curl -L ht ...
- 将DedeCMS从子目录移动到根目录的方法
http://www.commonie.com/a/chat/dedeskill/298.html 以前做了一个Wordpress的博客,后来觉得采用DedeCMS更好一点,所以就有了转向DedeCM ...
- 本地如何使用phpstudy环境搭建多站点
http://jingyan.baidu.com/article/e52e36154227ef40c70c5147.html 平时在开发项目的时候, 多个项目同时开发的时候会遇到都得放到根目录才能正常 ...
- 【翻译】A Next-Generation Smart Contract and Decentralized Application Platform
原文链接:https://github.com/ethereum/wiki/wiki/White-Paper 当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念 ...
- 引导图滤波(Guided Image Filtering)原理以及OpenCV实现
引导图是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>.这里只说一下自适应权重原理.C++实现灰度图 ...
- Hive总结(七)Hive四种数据导入方式
- Performance Testing 前期准备以及场景设计
性能测试的session参加过几个,也查阅了很多相关的资料.年前被分配了测试任务,一直拖到现在,准备开始做的时候,才发现真的是不知道如何做起啊.今天和同事聊了一下,有很大启发.测试小白一枚,只分享一下 ...
- Java进阶篇(五)——Java的I/O技术
程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...
- linux 从softnet_stat查看内核丢包信息
1.从系统整体来考虑,通过netstat 查看: [root@localhost net]# netstat -s |grep drop 3168 outgoing packets dropped 1 ...
- 微信小程序左右滑动切换图片酷炫效果(附效果)
开门见山,先上效果吧!感觉可以的用的上的再往下看. 心动吗?那就继续往下看! 先上页面结构吧,也就是wxml文件,其实可以理解成微信自己封装过的html,这个不多说了,不懂也没必要往下看了. < ...