题目链接:传送门

题目:

题目描述

小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. visio连接线设置

    以下画图是在新建空白模式的 默认的连线,如下图, 通过设置设计模式,可以把直角线编程直的线段, 设置如下图, 效果,如下图, 如果想在上面的图的线加箭头,可以一条一条加,但是,但是效率太低,我们可以通 ...

  2. 不正常退出vim产生swp文件的解决方法

    vi -r README.txt恢复文件,这样上次意外退出没有保存的修改,就会覆盖文件. vi -r查看生成的交换文件 rm .README.txt.swp删除交换文件 搞定!下次打开文件就可以正常编 ...

  3. Linux下执行.sh命令出现-bash: ./bin/start.sh: /bin/bash^M: bad interpreter: No such file or directory

    原因是 文件的格式是dos,修改为unix 就OK了 查看文件格式  用vim 打开出错的文件    按 ESC键     再按shift+冒号   输入 set  ff  回车   可以看见 该文件 ...

  4. @RequestBody注解的参数仅仅读取一次的问题解决。

    最近在写日志管理,想着使用拦截器加注解的方式,但是遇到了一个问题,就是如果使用@RequestBody注解接收的参数只能读取一次,造成了我在拦截器中如果接收了参数,在Controller层就接收不到了 ...

  5. django之admin管理工具

    admin组件 admin是django提供的基于web的管理工具 >如何使用: 1.激活管理工具 通常会在生成项目时在urls.py中自动设置好 from django.urls import ...

  6. laravel command调用方法命令

  7. 正则表达式中pw、IDCard和EM匹配

    1密码强度正则 //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])( ...

  8. javax.net.ssl.SSLException: Certificate doesn't match any of the subject alternative names

    问题:在使用 org.apache.http.*下的 CloseableHttpClient 发送https请求时报了以上错误 解决方案一:使用java.net.HttpURLConnection i ...

  9. 使用js实现思维导图

    使用js实现思维导图 demo:http://rockyren.github.io/mindmaptree/ 源码:http://github.com/RockyRen/mindmaptree/tre ...

  10. 结对作业——WordCount进阶版

    Deadline: 2018-10-7 22:00PM,以博客提交至班级博客时间为准 要求参考来自:https://www.cnblogs.com/xinz/archive/2011/11/27/22 ...