[六省联考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
表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...
随机推荐
- JDBC开发,数据库的连接
JDBC开发步骤 1.建完工程后,右击工程,new,新建一个文件夹Folder,装jar包, 2.将下载好的驱动包打开,找到jar文件,CTRL+C,选中装jar包的文件夹,CTRL+V ...
- React后台管理系统-file-uploader组件
1.React文件上传组件github地址: https://github.com/SoAanyip/React-FileUpload 2.Util里边新建file-uploader文件夹,里边新建i ...
- 列表与特殊字符,div(新手HTMLL基础)
1.无序列表 -项目符号:实心圆(disc).方框(square).空心圆(circle) -列表<ul>---- 列表项<li>--- </li></ul& ...
- 线段树和zkw线段树
作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...
- 转载:java分布式服务框架Dubbo的介绍与使用
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- python学习——StringIO和BytesIO
StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文 ...
- Flume-NG源码分析-整体结构及配置载入分析
在 http://flume.apache.org 上下载flume-1.6.0版本,将源码导入到Idea开发工具后如下图所示: 一.主要模块说明 flume-ng-channels 里面包含了fil ...
- 阿里云服务器+Tomcat项目+mysql 发布项目全过程
这个博客管理系统折腾我好几天了. 总结一下整个过程吧! 1.首先这个博客在tomcat下 windows系统可以完全跑起来了,无论是前台或者后台都能实现所有的功能. 2.然后我买了一个域名jasonj ...
- MVC中Spring.net 对基类控制器无效 过滤器控制器无效
比如现在我又一个BaseController作为基类控制器,用于过滤权限.登录判断等作用,其它控制由原本的继承Controller,改为继承BaseController.然后BaseControlle ...
- Gradle task
本文来自网易云社区 作者:孙有军 1:gradle脚本是使用groovy语言写的(DSL),groovy中有一个重要的概念闭包(Closure),Closure是一段单独的代码块,它可以接收参数,返回 ...