题目链接

https://www.luogu.org/problem/P1357

题目描述

小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15)。他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<=M<=5,M<=N)个花圃中有不超过K(1<=K<M)个C形的花圃,其余花圃均为P形的花圃。

例如,N=10,M=5,K=3。则

CCPCPPPPCC 是一种不符合规则的花圃;

CCPPPPCPCP 是一种符合规则的花圃。

请帮小L求出符合规则的花园种数Mod 1000000007

由于请您编写一个程序解决此题。

输入格式

一行,三个数N,M,K。

输出格式

花园种数Mod 1000000007

输入输出样例

输入 #1

10 5 3

输出 #1

458

输入 #2

6 2 1

输出 #2

18

说明/提示

【数据规模】

40%的数据中,N<=20;

60%的数据中,M=2;

80%的数据中,N<=10^5。

100%的数据中,N<=10^15。

思路

假如花园是一条链,设f[i][j]为在有i个花圃的情况下,最后m个花圃状态为j的花园种数。其中j为状态压缩下的二进制数,共有m位,1表示该位为C形花圃。

转移方程:

ll t1=j>>1,t2=(j>>1)|(1<<(m-1));
if(num_1(t2)<=k){//1的个数小于kf[i][j]=f[i-1][t1]+f[i-1][t2];
}
else{f[i][j]=f[i-1][t1];
}

举个例子,如果m=5,当前状态为10010,它可能是由状态01001或11001转移而来,如果都满足k的限制的话。

接下来,要考虑到花园是环形的。

换个角度想,一个有n个花圃环形花园与一个有n+m个花圃且前m个花圃与后m个花圃完全相同的链状花园的种类数是一样的。

假设前m个花圃的状态为j,那么我们先将所有f赋值为零,令f[m][j]=1,然后从f[m+1][...]开始计算,最终答案为f[n+m][j]。

枚举所有初始状态,求和得到最后结果。

由于n的值会很大,但递推式不复杂,可以采用矩阵快速幂优化算法。

代码

#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;ll n,m,k,len,f[101],y[100];inline ll num_1(ll st){ll ans=0;while(st){if(st&1==1)ans++;st=(st>>1);}return ans;
} struct Mat{ll mt[101][101];Mat(){memset(mt,0,sizeof(mt));}
};Mat a,e;
Mat Mul(Mat x,Mat y) //矩阵乘
{Mat c;for(ll i=1;i<=len;i++)for(ll j=1;j<=len;j++)c.mt[i][j]=0;for(ll i=1;i<=len;i++)for(ll j=1;j<=len;j++)for(ll k=1;k<=len;k++)c.mt[i][j]=c.mt[i][j]%mod+x.mt[i][k]*y.mt[k][j]%mod;return c;
}Mat pow(Mat x,ll y) //矩阵快速幂
{Mat ans=e;while(y){if(y&1)ans=Mul(ans,x);  x=Mul(x,x);y>>=1;}return ans;
}Mat init(){ll i,j;for(i=1;i<=len;i++)e.mt[i][i]=1;memset(a.mt,0,sizeof(a.mt));for(i=1;i<=len;i++){if(num_1(i-1)<=k){ll t1=((i-1)>>1),t2=(((i-1)>>1)|(1<<(m-1)));a.mt[i][t1+1]=1;if(num_1(t2)<=k){a.mt[i][t2+1]=1;   }}}  return pow(a,n);
}int main(){cin>>n>>m>>k;len=(1<<m);ll i,j,l;ll ans=0;Mat A=init();  for(l=0;l<len;l++){if(num_1(l)<=k){ans+=A.mt[l+1][l+1];ans%=mod; }} cout<<ans;return 0;
}

洛谷P1357 花园(状态压缩+矩阵快速幂)相关推荐

  1. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]

    洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 299  Solved: 207 Description 加里敦星球的 ...

  2. 洛谷P3390 【模板】矩阵快速幂

    传送门 从今天开始学习矩阵快速幂.jpg 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include< ...

  3. ZOJ 2317 Nice Patterns Strike Back(矩阵快速幂)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2317 题意:给你两种颜色,黑色和白色,填充n*m的方格,每个格子一种颜色, ...

  4. 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)

    [BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...

  5. P1357 花园 (矩阵快速幂+ DP)

    题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m <= 5  n <= 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速 ...

  6. 【洛谷P3390】 矩阵快速幂(模板)

    贴一下矩阵快速幂的模板 #include<iostream> #include<cstdio> #include<cstring> #include<stri ...

  7. [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)

    多年不考试,一夜回到解放前 T1:花园 title solution code T2:月亮神树 title solution code T3:保护出题人 title solution code T1: ...

  8. hdu 5434(状态压缩+矩阵优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5434 官方题解: 这个题用状态转移得到矩阵,再矩阵快速幂就可以了. 合体象的攻击范围是变少了的,我们可 ...

  9. 洛谷P1939 【模板】矩阵加速(数列)

    题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入格式 第一行一个整数T,表示询 ...

  10. 矩阵快速幂(矩阵加速)

    //南昌理工ACM集训队 放心食用 矩阵加速 快速幂(前置技能) 矩阵快速幂 可乐 附个模板 最后小结 本人小白如有不对欢迎指正ლ(╹◡╹ლ) 矩阵加速 快速幂(前置技能) 对于普通的求a的b次方,一 ...

最新文章

  1. MySql 日志查看与设置
  2. Ubuntu 12.04搭建MTK 6577 安卓开发环境
  3. 【转载】COM 连接点
  4. Spring MVC架构流程(请求处理流程)
  5. java动态代理_Java 动态代理和依赖注入
  6. Android、Java验证手机号是否合法
  7. gitignore不起作用
  8. 有时,你离成功的 exploit 只差一个信息泄漏:通过 ID tag 找到它
  9. 匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范
  10. 编程语言python入门-【python】编程语言入门经典100例--19
  11. linux下mysql数据库目录迁移_mysql实现linux下数据库目录迁移
  12. spring 事务隔离级别和传播行为_Spring 事务传播行为
  13. ubuntu mongodb安装
  14. 45_局域网ip正则表达式
  15. 蓝天准系统P750的介绍与开箱
  16. 电影:《三少爷的剑》票房折戟,武侠电影还能翻盘吗?
  17. Redis总结_实战篇
  18. Excel动态图制作
  19. 动态规划——1265:【例9.9】最长公共子序列
  20. Apache Tomcat优化

热门文章

  1. 通信原理SNR EbN0 EsN0理解
  2. linux格式化只读u盘,linux下FAT32格式u盘只读的问题及解决方法
  3. torch.sub()与torch.sub_()函数用法
  4. Fisheye-Crucible2.4.3安装破解
  5. 动态优化模型/ 变分法:泛函、极值、变分
  6. MySQL Shell 安装与基本使用
  7. GitHub | 面试官的DL/NLP/推荐系统/ML/算法基础面试必看知识点总结
  8. CentOS7各种代理设置
  9. c语言中用中文转化数字,用C语言写中文数字字符串转数值变量
  10. WPS word编辑图表数据的正确姿态