洛谷P1357 花园(状态压缩 + 矩阵快速幂加速递推)
题目链接:传送门
题目:
题目描述 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(<=N<=^)。他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(<=M<=,M<=N)个花圃中有不超过K(<=K<M)个C形的花圃,其余花圃均为P形的花圃。 例如,N=,M=,K=。则 CCPCPPPPCC 是一种不符合规则的花圃; CCPPPPCPCP 是一种符合规则的花圃。 请帮小L求出符合规则的花园种数Mod 由于请您编写一个程序解决此题。
输入输出格式
输入格式: 一行,三个数N,M,K。 输出格式: 花园种数Mod 输入输出样例
输入样例#: 输出样例#: 输入样例#: 输出样例#: 说明 【数据规模】 %的数据中,N<=; %的数据中,M=; %的数据中,N<=^。 %的数据中,N<=^。
思路:
乍一看是一个环形dp:
对于给定的长度为M的状态,其后面长度为M-1的部分会影响下一个状态,记一个cnt1表示已经放了C型花圃的数量,那么根据当前的cnt1是否小于K,可以决定下个状态的转移。
状态:
f[i][j]:以第i个位置为终点的长度为M的部分,状态为j的方案数。(j是用2进制状压的一个长度为M的状态)
状态转移方程:
f[i][j] += f[i-1][j>>1];
if (count1(j) == K && !(j&1))
f[i][j] += f[i-1][(j>>1)|(1<<M)];
。。。。。。
但是N的上限高达1e15,所以常规的方法没发跑,考虑用矩阵加速。
那就要找状态矩阵和转移矩阵了。
状态矩阵:
Fn = [f[n][0], f[n][1], ... , f[n][(1<<m)-1];
转移矩阵可以通过上面的状态转移方程,用dfs预处理出来,接下来就可以用快速幂加速了。
因为跑N次之后和不跑的时候状态相同(环形),所以直接求转移矩阵A的N次AN的对角线上的和即可。
代码:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MOD = 1e9 + ; ll N, M, K;
int bin[];
ll F[][], A[][]; void addTran(int sta, int cnt1)
{
int pre = sta >> ;
A[pre][sta] = ;
if (cnt1 == K && !(sta&))
return;
A[pre|bin[M-]][sta] = ;
} void dfs(int dep, int sta, int cnt1)
{
if (dep == M) {
addTran(sta, cnt1);
return;
}
dfs(dep+, sta, cnt1);//dep+1位为0
if (cnt1 < K && dep+ < M)
dfs(dep+, sta|bin[dep+], cnt1+);//dep+1位为1
} void mul(ll f[][], ll a[][])
{
ll c[][];
memset(c, , sizeof c);
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < ; k++)
c[i][j] = (c[i][j] + f[i][k] * a[k][j]) % MOD;
memcpy(f, c, sizeof c);
} int main()
{
bin[] = ;
for (int i = ; i <= ; i++)
bin[i] = bin[i-] << ;
cin >> N >> M >> K;
memset(A, , sizeof A);
memset(F, , sizeof F);//所有长度为M的状态
for (int i = ; i < bin[M]; i++)
F[i][i] = ;
dfs(, , );//初始化转移矩阵
dfs(, , );
for (; N; N >>= ) {
if (N&)
mul(F, A);
mul(A, A);
}
ll ans = ;
for (int i = ; i < bin[M]; i++)
ans = (ans + F[i][i]) % MOD;
cout << ans << endl;
return ;
}
/*
6 2 1
*/
洛谷P1357 花园(状态压缩 + 矩阵快速幂加速递推)的更多相关文章
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- HDU 1757 矩阵快速幂加速递推
题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...
- luogu1357 花园 状态压缩 矩阵快速幂
题目大意 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<= ...
- CH3401 石头游戏(矩阵快速幂加速递推)
题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- [bzoj1008](HNOI2008)越狱(矩阵快速幂加速递推)
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...
- HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...
- POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】
题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #includ ...
随机推荐
- 剑指offer(50)数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- IIS 设备未就绪。
看看Web.config 是否指向的磁盘在本机上不存在此磁盘
- VirtualBox运行出现“0x00000000指令引用的0x00000000内存。该内存不能为written” ,错误解决
win7 64位系统,运行virtual box 出现如下错误 错误原因:由于系统主题被破解导致的 解决办法: 1.管理员身份运行UniversalThemePatcher_1.5.22 x64,点击 ...
- 【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份
在数据库管理中,数据库备份是非常重要的. 通过维护计划向导,可以很方便的完成数据库备份. 下面的例子说明了如何实现数据库的备份,具体的备份策略是:每周日一次完整备份.每天差异备份(除周日外).每小时日 ...
- 第一次作业——WorkCount
项目地址:https://gitee.com/yangfj/wordcount_project 1.软件需求分析: 撰写PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) ...
- MAC 下 Excel打开UTF-8格式的文件乱码
为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头.这作为一个”特征符”或”字节顺序标记(byte-o ...
- hadoop之安装
在Linux环境下安装Hadoop: 一.安装环境 硬件:虚拟机 操作系统:Centos 6.4 64位 IP:192.168.153.130主机名:imooc安装用户:root ...
- HDFS二.HDFS实现分布式文件存储---体系结构
单击模式(Standalone): 单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置.在这种默认模式下所有3个XML文件均为 ...
- JsonLayout log4j2 json格式输出日志
如果日志输出时,想改变日志的输出形式为Json格式,可以在log4j2.xml中使用JsonLayout标签,使日志输出格式为Json格式. 前提需要Jackson的包,保证项目中包含jackson的 ...
- 在windows下安装nvm并管理nodejs版本
不得不说,nodejs的nvm工具跟python下的mkvirtualenv 工具很像.作为立志成为伪全栈的我来说,玩玩nodejs是必不可少的.nodejs 有很多种的安装方式,下面我用nvm的方式 ...