题目链接


Solution

矩阵优化 \(dp\).

题中给出的式子的意思就是:

求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数.

考虑朴素 \(dp\) ,定义状态 \(f[i][j]\) 代表前 \(i\) 个物品选择 \(mod~k\) 为 \(j\) 的方案数.

那么转移方程也很简单 :

\[f[i][j]_{j\in[1,i)}=f[i-1][j]+f[i-1][(j-1+k)mod~k]
\]

但是很显然这样是 \(O(n^2k)\) .

考虑优化,发现对于每一项状态,仅与 \(i-1\) 的状态有关.

如此我们可以考虑构建一个 \(k*k\) 的转移矩阵,即:

\[ \begin{matrix}
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$)的更多相关文章

  1. P3746 [六省联考2017]组合数问题

    P3746 [六省联考2017]组合数问题 \(dp_{i,j}\)表示前\(i\)个物品,取的物品模\(k\)等于\(r\),则\(dp_{i,j}=dp_{i-1,(j-1+k)\%k}+dp_{ ...

  2. [BZOJ4870][六省联考2017]组合数问题(组合数动规)

    4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 748  Solved: 398[Submit][Statu ...

  3. [BZOJ4872][六省联考2017]分手是祝愿(期望DP)

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 516  Solved: 342[Submit][Statu ...

  4. bzoj千题计划263:bzoj4870: [六省联考2017]组合数问题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4870 80分暴力打的好爽 \(^o^)/~ 预处理杨辉三角 令m=n*k 要求满足m&x== ...

  5. 洛谷P3746 [六省联考2017]组合数问题

    题目描述 组合数 C_n^mCnm​ 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数.举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种 ...

  6. P3746 【[六省联考2017]组合数问题】

    题目是要我们求出如下柿子: \[\sum_{i=0}^{n}C_{nk}^{ik+r}\] 考虑k和r非常小,我们能不能从这里切入呢? 如果你注意到,所有组合数上方的数\(\%k==r\),那么是不是 ...

  7. 洛谷$P$3746 [六省联考2017]组合数问题 $dp$+矩乘+组合数学

    正解:$dp$+矩乘+组合数学 解题报告: 传送门! 首先不难发现这个什么鬼无穷就是个纸老虎趴,,,最多在$\binom{n\cdot k+r}{n\cdot k}$的时候就已经是0了后面显然不用做下 ...

  8. BZOJ4870 [六省联考2017] 组合数问题 【快速幂】

    题目分析: 构造f[nk][r]表示题目中要求的东西.容易发现递推公式f[nk][r]=f[nk-1][r]+f[nk-1][(r-1)%k].矩阵快速幂可以优化,时间复杂度O(k^3logn). 代 ...

  9. [六省联考2017]分手是祝愿 期望DP

    表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...

随机推荐

  1. matlab中size函数总结

    size(A)函数是用来求矩阵的大小的. 比如说一个A是一个3×4的二维矩阵: 1.size(A) %直接显示出A大小 输出:ans= 3 4 2.s=size(A)%返回一个行向量s,s的第一个元素 ...

  2. C#Json数据交互

    问题:写项目时,难免会遇到前台和后台要进行数据交换,往前台传一个对象或一个对象集,往后台传一个对象,一个对象集.怎么传,你当然不能直接去传递一个对象或对象集,我们可以利用JSON数据相互之间传值. J ...

  3. Nginx高性能web服务器详解书中概要

    一.Nginx功能 1.Nginx服务器以其功能丰富著称于世.它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI.SSL.V ...

  4. 16.2--Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署

    分类: Linux服务篇,Linux架构篇   一.环境需求 本帖针对的是Linux环境,Windows或其他系统也可借鉴.具体只讲述Jenkins配置以及整个流程的实现. 1.JDK(或JRE)及J ...

  5. 精读《sqorn 源码》

    1 引言 前端精读<手写 SQL 编译器系列> 介绍了如何利用 SQL 生成语法树,而还有一些库的作用是根据语法树生成 SQL 语句. 除此之外,还有一种库,是根据编程语言生成 SQL.s ...

  6. python面向对象之反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  7. 怎么选取训练神经网络时的Batch size?

    怎么选取训练神经网络时的Batch size? - 知乎 https://www.zhihu.com/question/61607442 深度学习中的batch的大小对学习效果有何影响? - 知乎 h ...

  8. POJ1426-Find The Multiple(搜索)

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42035   Accepted: 176 ...

  9. JQ剪辑图片插件,适用于移动端和PC端

    主要用到以下JS文件: <script src="js/photo/iscroll-zoom.js"></script> <script src=&q ...

  10. 1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9016  Solved: 4085[Submit][Sta ...