题目链接


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. Luogu [P2708] 硬币翻转

    硬币翻转 题目详见:硬币翻转 这道题是一道简单的模拟(其实洛谷标签上说这道题是搜索???),我们只需要每一次从前往后找相同的硬币,直到找到不同的硬币n,然后将找到的前n-1个相同的硬币翻过来,每翻一次 ...

  2. Java代码工具箱_用Set给List/Vector去重

    参考 方法一:需要2个容器,1个迭代去重,1个作为结果容器. 此方法其实想法比较简单也是正常思路: package com.yonyou.test; import java.util.List; im ...

  3. 高阶函数 -------JavaScript

    高阶函数 本文摘要:http://www.liaoxuefeng.com/ JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作 ...

  4. struts+hibernate+spring整合过程常见问题收集

    1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor缺少asm-3.3.jar2.java.lang.NoClassDefF ...

  5. java抓取12306火车余票信息

    最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...

  6. vue-cli的build的文件夹下没有dev-server.js文件,怎么配置mock数据

    因为最新版本的vue-cli已经放弃dev-server.js,只需在webpack.dev.conf.js配置就行 新版webpack.dev.conf.js配置如下: 在const portfin ...

  7. PS1

    linux系统终端命令提示符设置(PS1)记录 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/5985970.html PS(Prompt Sig ...

  8. H5各种头部meta标签的功能

    <!DOCTYPE html>  H5标准声明,使用 HTML5 doctype,不区分大小写 <head lang=”en”> 标准的 lang 属性写法 <meta ...

  9. Python 正则表达式 匹配任意字符

    .(句点)匹配除了换行之外的所有一个字符, .*(点-星)匹配除了换行外的所有字符 >>> >>> r=re.compile(r'.*')>>> ...

  10. LA_3942 LA_4670 从字典树到AC自动机

    首先看第一题,一道DP+字典树的题目,具体中文题意和题解见训练指南209页. 初看这题模型还很难想,看过蓝书提示之后发现,这实际上是一个标准DP题目:通过数组来储存后缀节点的出现次数.也就是用一颗字典 ...