[六省联考2017]组合数问题 (矩阵优化$dp$)
题目链接
Solution
矩阵优化 \(dp\).
题中给出的式子的意思就是:
求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数.
考虑朴素 \(dp\) ,定义状态 \(f[i][j]\) 代表前 \(i\) 个物品选择 \(mod~k\) 为 \(j\) 的方案数.
那么转移方程也很简单 :
\]
但是很显然这样是 \(O(n^2k)\) .
考虑优化,发现对于每一项状态,仅与 \(i-1\) 的状态有关.
如此我们可以考虑构建一个 \(k*k\) 的转移矩阵,即:
mod~k= &0 &1 &2 &...&k-1\\
&1 & 0 &0&...& 1 \\
&1 &1&0 &... &0 \\
&0 & 1 &1 &... & 0\end{matrix}
\tag{1}
\]
然后初始矩阵即为一个 \(k*1\) 的矩阵.
然后就可以矩阵快速幂了.
Code
#include<bits/stdc++.h>
#define in(x) x=read()
#define ll long long
using namespace std;
int read()
{
char ch=getchar(); int w=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return w;
}
ll n,mod,k,r;
struct Matrix{
ll a[51][51];
};
Matrix X(Matrix s,Matrix e)
{
Matrix c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
for(int l=0;l<k;l++)
{
c.a[i][j]+=(s.a[i][l]*e.a[l][j])%mod;
c.a[i][j]%=mod;
}
return c;
}
Matrix quick_pow(Matrix s,ll ks)
{
if(ks==1)return s;
Matrix k=s; ks--;
while(ks>0)
{
if(ks%2==1)k=X(k,s);
ks/=2;
s=X(s,s);
}
return k;
}
Matrix x(Matrix s,Matrix e)
{
Matrix c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<1;i++)
for(int j=0;j<k;j++)
for(int l=0;l<k;l++)
{
c.a[j][i]+=(s.a[j][l]*e.a[l][i])%mod;
c.a[j][i]%=mod;
}
return c;
}
int main()
{
in(n),in(mod),in(k),in(r);
Matrix P,f;
memset(P.a,0,sizeof(P.a));
memset(f.a,0,sizeof(f.a));
for(ll i=0;i<k;i++)
{
if(i==0)
P.a[i][0]++,P.a[i][k-1]++;
else
P.a[i][i-1]++,P.a[i][i]++;
}
P=quick_pow(P,n*k);
f.a[0][0]=1;
f=x(P,f);
cout<<f.a[r%k][0]%mod<<endl;
}
[六省联考2017]组合数问题 (矩阵优化$dp$)的更多相关文章
- P3746 [六省联考2017]组合数问题
P3746 [六省联考2017]组合数问题 \(dp_{i,j}\)表示前\(i\)个物品,取的物品模\(k\)等于\(r\),则\(dp_{i,j}=dp_{i-1,(j-1+k)\%k}+dp_{ ...
- [BZOJ4870][六省联考2017]组合数问题(组合数动规)
4870: [Shoi2017]组合数问题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 748 Solved: 398[Submit][Statu ...
- [BZOJ4872][六省联考2017]分手是祝愿(期望DP)
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 516 Solved: 342[Submit][Statu ...
- bzoj千题计划263:bzoj4870: [六省联考2017]组合数问题
http://www.lydsy.com/JudgeOnline/problem.php?id=4870 80分暴力打的好爽 \(^o^)/~ 预处理杨辉三角 令m=n*k 要求满足m&x== ...
- 洛谷P3746 [六省联考2017]组合数问题
题目描述 组合数 C_n^mCnm 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数.举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种 ...
- P3746 【[六省联考2017]组合数问题】
题目是要我们求出如下柿子: \[\sum_{i=0}^{n}C_{nk}^{ik+r}\] 考虑k和r非常小,我们能不能从这里切入呢? 如果你注意到,所有组合数上方的数\(\%k==r\),那么是不是 ...
- 洛谷$P$3746 [六省联考2017]组合数问题 $dp$+矩乘+组合数学
正解:$dp$+矩乘+组合数学 解题报告: 传送门! 首先不难发现这个什么鬼无穷就是个纸老虎趴,,,最多在$\binom{n\cdot k+r}{n\cdot k}$的时候就已经是0了后面显然不用做下 ...
- BZOJ4870 [六省联考2017] 组合数问题 【快速幂】
题目分析: 构造f[nk][r]表示题目中要求的东西.容易发现递推公式f[nk][r]=f[nk-1][r]+f[nk-1][(r-1)%k].矩阵快速幂可以优化,时间复杂度O(k^3logn). 代 ...
- [六省联考2017]分手是祝愿 期望DP
表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...
随机推荐
- SQLServer事务的原理
1.事务的概念 是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数据库操作序列组成: 由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操 ...
- Redis学习记录(二)
1.Key命令 设置key的过期时间. expire key second:设置key的过期时间 ttl key:查看key的有效期(如果显示正数说明该key正在倒计时,如果是-1说明该key永久保存 ...
- SQL Server中Table字典数据的查询SQL示例代码
SQL Server中Table字典数据的查询SQL示例代码 前言 在数据库系统原理与设计(第3版)教科书中这样写道: 数据库包含4类数据: 1.用户数据 2.元数据 3.索引 4.应用元数据 其中, ...
- git提交时报错 permission denied
git push 时报错:permission denied xxx 目前很多解决办法是生成公钥和秘钥,这种方法安全可靠,比较适用于一台电脑对应一个git账户,但是多个账户在同一台电脑上提交使用git ...
- 数据库引擎InnoDB和myisam的区别和联系
1.ENGINE=InnoDB 数据库存储引擎,DEFAULT 默认,CHARSET=utf8 数据库字符编码 2.数据库的存储引擎, mysql中engine=innodb和engine=myisa ...
- jQuery实现复选框的全选、反选功能
<ul id="list"> <li><label><input type="checkbox" value=&quo ...
- IE支持直接查看Json数据注册表代码
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json] ...
- 小技巧之padding-bottom实现等比例图片缩放
1.padding-bottom 如果用%来表示的话,计算是根据父元素的width的值进行计算的. 例:父元素.wrapper的width是100px,height设置为0, padding-bott ...
- WebUploader压缩图片上传
WebUploader,由Baidu FEX 团队开发,以H5为主,FLASH为辅,兼容 IE6+,iOS 6+, android 4+,采用大文件分片并发上传,极大的提高了文件上传效率,看了官方文档 ...
- oop 单例模式