题目描述

小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: 复制

【样例输入1】
10 5 3【样例输入2】
6 2 1

输出样例#1: 复制

【样例输出1】
458【样例输出2】
18

说明

【数据规模】

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

60%的数据中,M=2;

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

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

前80%的N<=100000N<=100000,还是可做的,和容易想到用DP搞,因为m<=5m<=5,,所以我们可以把最后的m盆花进行状压,f[i][j]f[i][j]表示共有i盆花且最后mm盆花的状态为jj的时候的方案数,那么我们就可以将以个可以转移给jj的状态的方案书加给他,即状态转移方程为f[i][j] = Σ{f[i-1][k]}f[i][j]=Σf[i−1][k],那么问题又来了,题目中说所有的花都是环形,我这样做如何保证所有的方案都是环形的呢.我们可以多次DP

每次DP前将其中一个合法状态赋值kk为1,然后从mm盆花一直更新到m+nm+n盆花,最后我再将f[m+n][k]f[m+n][k]加到ansans中,这样我就可以保证最后更新出的答案中的方案数都是有最开始的kk开始且又以kk结束的方案,即组成了一个环.最后的ansans即为我的方案数.

其实我们会发现,对于一个合法状态,更新它的合法状态始终是不变的,并且总会更新N次,也就是说对于每一次转移,都相当于给原数组乘以了一个矩阵,并且很显然这个矩阵是不变的,而且它就是当初我们处理出来的表示转移关系的那个bool数组,既然这样,那我们的$f[i][j]中的第一维就没有任何意义了,我们可以将它扔掉,变成一个一维数组,然后我们又会发现,其实最终的答案就是那个矩阵的对角线之和。

80分:

#include<iostream>
#include<cstring>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MOD=1000000007;
long long n;
int m,K,S,sta[100],v[100][100];
int f[100010][64],ans=0;
inline Matrix Pow(Matrix x,int k)
{Matrix ans=x;k--;for(;k;k>>=1,x=x*x){if(k&1){ans=ans*x;}}    return ans;
}
inline bool pd(int s)
{int i,num=0;f(i,0,m-1){if(s&(1<<i)) num++;if(num>K) return false;}return true;
}
inline bool check(int x,int y)
{int i;f(i,0,m-2){int a=(sta[x]>>i)&1;int b=(sta[y]>>i+1)&1;if(a!=b) return false;}return true;
}
inline void dp(int s)
{int i,j,k;memset(f,0,sizeof(f));f[m][s]=1;f(i,m+1,m+n){f(j,1,sta[0]){f(k,1,sta[0]){f[i][j]=(f[i][j]+f[i-1][k]*v[k][j])%MOD;}}}ans=(ans+f[m+n][s])%MOD;
}
int main()
{ios::sync_with_stdio(false);int i,j;cin>>n>>m>>K;S=(1<<m)-1;f(i,0,S){int num=0;if(pd(i)) sta[++sta[0]]=i;}f(i,1,sta[0]){f(j,1,sta[0]){if(check(i,j)){A.v[i][j]=1;}}}f(i,1,sta[0]){dp(i);}cout<<ans<<endl;return 0;
}

100分:

#include<iostream>
#include<cstring>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MOD=1000000007;
long long n;
int m,K,S,sta[100];
int f[100010][64];
long long ans=0;
struct Matrix{long long v[50][50];Matrix(){memset(v,0,sizeof(v));}Matrix operator *(const Matrix& x)const{Matrix ans;int i,j,k;f(i,1,sta[0]){f(j,1,sta[0]){f(k,1,sta[0]){ans.v[i][j]=(ans.v[i][j]+v[i][k]*x.v[k][j])%MOD;}}}return ans;}
}A;
inline Matrix Pow(Matrix x,long long k)
{Matrix ans=x;k--;for(;k;k>>=1,x=x*x){if(k&1){ans=ans*x;}}    return ans;
}
inline bool pd(int s)
{int i,num=0;f(i,0,m-1){if(s&(1<<i)) num++;if(num>K) return false;}return true;
}
inline bool check(int x,int y)
{int i;f(i,0,m-2){int a=(sta[x]>>i)&1;int b=(sta[y]>>i+1)&1;if(a!=b) return false;}return true;
}
int main()
{ios::sync_with_stdio(false);int i,j;cin>>n>>m>>K;S=(1<<m)-1;f(i,0,S){int num=0;if(pd(i)) sta[++sta[0]]=i;}f(i,1,sta[0]){f(j,1,sta[0]){if(check(i,j)){A.v[i][j]=1;}}}Matrix b=Pow(A,n);f(i,1,sta[0]){ans=(ans+b.v[i][i])%MOD;}cout<<ans<<endl;return 0;
}

花园 洛谷p1357相关推荐

  1. 洛谷P1133 教主的花园 动态规划

    洛谷P1133 教主的花园 动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP 注意如果当前是 2 的话要分情况 上一次是上 ...

  2. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  3. 洛谷P4113 [HEOI2012]采花 题解

    洛谷P4113 [HEOI2012]采花 题解 题目链接:P4113 [HEOI2012]采花 题意:萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园 ...

  4. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  5. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  6. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  7. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  8. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  9. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  10. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

最新文章

  1. 【视频】V4L2之ioctl
  2. 蚂蚁某程序员吐槽前端招人难:一是因为要求高,二是因为招聘卷!网友却说:十万月薪也不去阿里!...
  3. IDEA+DevTools实现热部署功能
  4. Gradient Boost 算法流程分析
  5. ML之分类预测:机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现
  6. 获取当前div以外所有部分
  7. 验证 Boost.Optional 复制构造函数不会尝试调用从模板化参数初始化构造函数的元素类型
  8. 百度新闻 谷歌新闻_每日新闻摘要:到目前为止,Google I / O提供的最佳信息
  9. 唱好铁血丹心谐音正规_长沙正规的音乐高考培训学校
  10. 剧情介绍:“遗愿清单”
  11. 专票冲红出现服务器为空,增值税专用发票作废、冲红、丢失了?别慌,可这样处理...
  12. 软件测试价值提升之路--第2部分“扫门前雪”-第3章“拦截缺陷”-读书笔记
  13. 深入Tensorflow Embedding,解决Tensorboard无法显示PROJECTOR问题
  14. 关于innerText和value的区别 2020-10-21
  15. 节假日读取接口_节假日API接口,2018年,直接计算好的
  16. 崩溃,80后千万富翁名单
  17. Linux Framebuffer驱动剖析之一—软件需求
  18. lstm预测单词_下一个单词预测完整指南
  19. 作为新一代网络基础设施,区块链已有了哪些应用?
  20. Xshell小键盘不能使用,反斜杠不能输入

热门文章

  1. 数字图像处理实验三各种图像类型转换
  2. element遮罩_如何实现全屏遮罩(附Vue.extend和el-message源码学习)
  3. matlab怎么显示bfm模型的纹理模型,【计算机视觉基础】如何通过BFM模型得到人脸关键特征点的信息...
  4. bat 实现笔记本键盘开关
  5. 使用fisheye4.8(crucible4.8)添加仓库时出现的问题
  6. 阿里云香港服务器被打流量攻击怎么办
  7. python累乘怎么写_python实现累乘multi函数(函数参数不限)
  8. 网站html源代码如何修改,如何修改网页源代码
  9. Lucene--千锋修改+踩坑版本
  10. PAT甲级1146 Topological Order (25 分)