BZOJ-2-4870: [Shoi2017]组合数问题 矩阵优化 DP
就 是 要 我 们 从  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的更多相关文章
- bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]
		
4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...
 - [六省联考2017]组合数问题 (矩阵优化$dp$)
		
题目链接 Solution 矩阵优化 \(dp\). 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 \(dp\) ,定义状态 \(f[i][ ...
 - bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...
 - BZOJ 4870: [Shoi2017]组合数问题 矩阵乘法_递推
		
Code: #include <cstdio> #include <cstring> #include <algorithm> #define setIO(s) f ...
 - bzoj 3120 矩阵优化DP
		
我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...
 - 矩阵优化dp
		
链接:https://www.luogu.org/problemnew/show/P1939 题解: 矩阵优化dp模板题 搞清楚矩阵是怎么乘的构造一下矩阵就很简单了 代码: #include < ...
 - HDU - 2294: Pendant(矩阵优化DP&前缀和)
		
On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K ki ...
 - [Sdoi2017]序列计数 矩阵优化dp
		
题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...
 - BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
		
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
 
随机推荐
- RefineDet训练自己的数据
			
https://github.com/sfzhang15/RefineDet 1.编译安装 cp Makefile.config.example Makefile.config make all -j ...
 - 使用 declare 语句和strict_types 声明来启用严格模式:
			
使用 declare 语句和strict_types 声明来启用严格模式: Caution: 启用严格模式同时也会影响返回值类型声明. Note: 严格类型适用于在启用严格模式的文件内的函数调用,而不 ...
 - poj2942 求v-DCC,二分图判奇环,补图
			
/* 给定一张无向图,求有多少点不被任何奇环包含 推论1:如果两个点属于两个不同的v-DCC,则他们不可能在同一个奇环内 推论2:某个v-DCC中有奇环,则这个v-DCC中所有点必定被属于某个奇环 只 ...
 - uva11865 二分流量+最小生成树
			
uva好题真多 本题用二分法找flow,把流量小于flow的全部筛掉,剩下的边建立最小树形图,如果权值大于c或者不能建图,那么修改二分边界 上代码,觉得最小树形图的代码很优美 /* 题意:给定n个点, ...
 - selenium 操作键盘
			
send_keys(Keys.ENTER) 按下回车键send_keys(Keys.TAB) 按下Tab制表键send_keys(Keys.SPACE) 按下空格键spacesend_keys(Kye ...
 - 51 nod 1181 质数中的质数(质数筛法)
			
1181 质数中的质数(质数筛法) 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的 ...
 - HDU 1541 STAR(树状数组)
			
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
 - caffe入门-人脸检测1
			
最近刚入门caffe,跟着视频做了一个简单人脸检测.包括人脸二分类模型+方框框出人脸. 人脸二分类模型 1. 收集数据 我用的是lfw数据集,总共有13233张人脸图片.非人脸数据有两种选择.1. 用 ...
 - snmp v3的安全配置 snmp认证与加密配置(53)
			
http://www.ttlsa.com/zabbix/snmp-v3-configuration/
 - es6 箭头函数【箭头表达式】
			
箭头函数,通过 => 语法实现的函数简写形式,C#/JAVA8/CoffeeScript 中都有类似语法.与函数不同,箭头函数与其执行下文环境共享同一个 this.如果一个箭头函数出现在一个函数 ...