就 是 要 我 们 从  n k  件 物 品 里 面 选 出 若 干 件,使 得 其 数 量 模 k 等 于 r 的 方 案 数 。
dp方程 f [ i , j ] 表示前 i 件物品拿了若干件使得其数量模 k 等 于 j 的 方 案 数。

非常明显的 i 与 i - 1递推的DP,  可以转化推矩阵,进行矩阵乘法。

那么显然有f [ i , j ] =  f [ i − 1 ,j ]  + f[ i − 1,j − 1 ]  f [  i , j ]= f  [ i  − 1,j ]+ f [ i − 1, j − 1 ]
矩阵乘法优化即可,注意 k等于 1时 矩阵初始化  需要一直 ++而不是赋值为 1。

#include<bits/stdc++.h>
using namespace std;
#define maxn 55
#define ll long long
ll n,mod,k,r;
struct node
{
ll sx,sy;
ll num[maxn][maxn];
void up1()
{
for(int i=0; i<sx; i++)
for(int j=0; j<sy; j++)
num[i][j]=0;
}
} A,ans;
node operator*(node a,node b)
{
node c;
c.sx=a.sx,c.sy=b.sy;
c.up1();
for(int i=0; i<a.sx; i++)
for(int j=0; j<b.sy; j++)
for(int q=0; q<a.sy; q++)
c.num[i][j]=(c.num[i][j]%mod+a.num[i][q]%mod*b.num[q][j]%mod)%mod;
return c;
}
void qpow(ll b)
{
while(b)
{
if(b%2)
ans=ans*A;
A=A*A;
b>>=1;
}
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&mod,&k,&r);
ans.sx=1;
ans.sy=A.sx=A.sy=k;
A.up1();
ans.up1();
ans.num[0][0]=1;
for(int i=0; i<k; i++)
{
A.num[i][i]=1;
A.num[i][(i+1)%k]++;
}
qpow(n*k);
printf("%lld\n",ans.num[0][r]);
return 0;
}

  

BZOJ-2-4870: [Shoi2017]组合数问题 矩阵优化 DP的更多相关文章

  1. bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]

    4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...

  2. [六省联考2017]组合数问题 (矩阵优化$dp$)

    题目链接 Solution 矩阵优化 \(dp\). 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 \(dp\) ,定义状态 \(f[i][ ...

  3. bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...

  4. BZOJ 4870: [Shoi2017]组合数问题 矩阵乘法_递推

    Code: #include <cstdio> #include <cstring> #include <algorithm> #define setIO(s) f ...

  5. bzoj 3120 矩阵优化DP

    我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...

  6. 矩阵优化dp

    链接:https://www.luogu.org/problemnew/show/P1939 题解: 矩阵优化dp模板题 搞清楚矩阵是怎么乘的构造一下矩阵就很简单了 代码: #include < ...

  7. HDU - 2294: Pendant(矩阵优化DP&前缀和)

    On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K ki ...

  8. [Sdoi2017]序列计数 矩阵优化dp

    题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...

  9. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

随机推荐

  1. mongoDB基础使用

    环境交代 操作系统: CentOS 6.8 64位 mongodb: 4.06 安装 官方下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62 阿里云 ...

  2. Vuejs的一些总结

    http://blog.csdn.net/xllily_11/article/details/52312044 原文链接:http://mrzhang123.github.io/2016/07/14/ ...

  3. Appium 常用方法总结 (python 版)

    1.app后台运行 driver.background_app(5) 2.锁屏 driver.lock(5) 3.隐藏键盘 driver.hide_keyboard() 4.启动一个app或者在当前a ...

  4. 微信小程序开发 如何退出当前页面

    默认是在首页 wx.navigateBack({     delta: -1 });     详情参考. https://mp.weixin.qq.com/debug/wxadoc/dev/api/u ...

  5. hexo+github page +markdown问题汇总

    1.没有权限提交 解决办法:把git版本由2.x改为1.9 未完待续

  6. Java+selenium之WebDriver定位页面元素(二)

    Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法: 单个对象的定位方法,多个对象的定位方法和层级定位 1. 定位单个元素 // 对于元素的属性包含 id 的情况适用,推 ...

  7. social psychology 10th David G. Myers

    Social psychology is a science that studies the influences of our situations, with special attention ...

  8. 报错ERR_CONNECTION_REFUSED,如何解决(原创)

    当我访问我的一个后天地址的时候,突然出现了ERR_CONNECTION_REFUSED,但是之前是可以访问的. 我先ping了下这个网址,发现是OK的 然后我想可能是80端口有问题,也就是说可能是WE ...

  9. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  10. Node 杂技

    1.关于require 当文件夹a中含有index.js时,在b.js中如果有require("文件夹a的路径"),则将会自动执行index.js的语句