题目链接:传送门

题目:

题目描述

小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 花园(状态压缩 + 矩阵快速幂加速递推)的更多相关文章

  1. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  2. 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 ...

  3. 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 ...

  4. luogu1357 花园 状态压缩 矩阵快速幂

    题目大意 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<= ...

  5. CH3401 石头游戏(矩阵快速幂加速递推)

    题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...

  6. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

    Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...

  7. [bzoj1008](HNOI2008)越狱(矩阵快速幂加速递推)

    Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...

  8. HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)

    题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...

  9. POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】

    题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #includ ...

随机推荐

  1. FL studio的循环模式简介

    在FL studio中,有一个非常有用的功能,它可以加快我们的工作进程,它就是循环模式. 通过频道循环,我们可以在单个模式中创建整个项目,然后使用“按频道分割”将它们分开,以便在播放列表中排列.通常情 ...

  2. ant_<target>标签含义与使用

    <target>标记目标 目标是一个或多个任务的集合,任务是一段可执行的代码:构建文件中包含一个项目,在项目内部声明了所有目标: <target name = "run&q ...

  3. Mock.js 虚拟接口 数据模拟

    Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 大概记录下使用过程, 详细使用可以参 ...

  4. lib下的Jar包在项目打包的时候提示不能找不到

    maven 使用本地包 lib jar包 依赖一个lib目录 解决方法: <plugin> <groupId>org.apache.maven.plugins</grou ...

  5. 解决悬浮的<header>、<footer>遮挡内容的处理技巧

    在现在的前端页面中,尤其是移动端,经常会需要将<header>或者是<footer>模块悬浮出来,跟随页面的滑动保持定位在页面的最上方或者是最下方,如下图所示. “回复主题”模 ...

  6. Runtime-消息发送和消息转发

    消息发送 消息发送举例:下面这个OC代码 [person read:book]; 会被编译成: objc_msgSend(person, @selector(read:), book); objc_m ...

  7. easyui datebox时间控件如何只显示年月

    easyui datebox控件,只显示年月,不显示年月日 需要的效果图如下: 具体的js代码: <script> $(function(){ intiMonthBox('costTime ...

  8. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...

  9. python中 元组

    #元组,不可变的list,一旦定义好就不可被改变,一般会用于连接数据库信息等:#他也是通过下标访问的#定义一个空的元组a=()t=('127.0.0.0',3306,'root','123456')t ...

  10. Linux3.10.0块IO子系统流程(7)-- 请求处理完成

    和提交请求相反,完成请求的过程是从低层驱动开始的.请求处理完成分为两个部分:上半部和下半部.开始时,请求处理完成总是处在中断上下文,在这里的主要任务是将已完成的请求放到某个队列中,然后引发软终端让中断 ...