往复

Coldhac 做不出题了,他在长为 n 的走廊里走来走去。从位置 1 开始, 每次他会向前走长为 i ∈ [1, k] 的一步(不能超出走廊的范围),直至到达位 置 n。

在想出正解前,Coldhac 这样走了 m 次。你想知道他几乎经过了所有 位置的方案数模 109 + 7 的值。两种方案不同当且仅当总步数不同或某一步 的长度不同。

几乎的定义:至多有一个位置没有被直接到达。你可以参照样例解释 来更好地理解这句话。

对于所有测试点,满足 n ≤ 109 , m ≤ 16, k ≤ 3。

题解

此处只讨论 k = 3 的情况。

稍微压一下状态,fi,x,y,d 表示第 i 个格子有 x 个落点,第 i − 1 个格子 有 y 个落点(说明 i − 2 有 m − x − y 个落点),计算过的格子里有 d ∈ [0, 1] 个没有经过的方案数。

我是万万没想到还可以这样设状态。

枚举 i 和 i − 1 中分别选出多少跳到 i + 1 即可,如果此时 i + 1 没有 落点,我们令 d + +。

显然 i 一维可以矩乘,复杂度 O(3063 log n)。

CO int N=306;
int c[21][21];
typedef tuple<int,int,int> tup;
int K,id;
map<tup,int> H;
int cid(int x,int y,int d){
if(K==2) y=0; // m-x-y
return H[tup(x,y,d)];
}
int T[N][N],I[N][N],A[N],B[N]; int main(){
freopen("iterate.in","r",stdin),freopen("iterate.out","w",stdout);
int n=read<int>()-1,m=read<int>();
if(read(K)==1) return puts("1"),0;
for(int i=0;i<=m;++i){
c[i][0]=c[i][i]=1;
for(int j=1;j<i;++j) c[i][j]=add(c[i-1][j-1],c[i-1][j]);
}
for(int i=0;i<=m;++i)for(int j=0;K==3?i+j<=m:j<1;++j)
for(int a=0;a<2;++a) H[tup(i,j,a)]=id++;
for(int i=0;i<=m;++i)for(int j=0;K==3?i+j<=m:j<1;++j){
int k=m-i-j;
for(int a=0;a<2;++a)
for(int x=0;x<=i;++x)for(int y=0;y<=j;++y){
int b=x+y+k==0;
if(a+b<=1) T[cid(i,j,a)][cid(x+y+k,i-x,a|b)]=mul(c[i][x],c[j][y]);
}
}
A[cid(m,0,0)]=1;
for(;n;n>>=1){
if(n&1){
for(int i=0;i<id;++i)for(int j=0;j<id;++j)
B[j]=add(B[j],mul(A[i],T[i][j]));
for(int i=0;i<id;++i) A[i]=B[i],B[i]=0;
}
for(int i=0;i<id;++i)for(int j=0;j<id;++j)
for(int k=0;k<id;++k) I[i][j]=add(I[i][j],mul(T[i][k],T[k][j]));
for(int i=0;i<id;++i)for(int j=0;j<id;++j) T[i][j]=I[i][j],I[i][j]=0;
}
printf("%d\n",add(A[cid(m,0,0)],A[cid(m,0,1)]));
return 0;
}

test20191020 往复的更多相关文章

  1. 记一次Pr中视频蜜汁卡顿往复和解决方法

    目录 问题 换素材的起因 灵异素材 无端联想 解决 问题 换素材的起因 本来视频剪了一晚剪完了,导出一看,好家伙,糊到上世纪.原来素材的像素大小都没法看,这视频素材我是从别人U盘拷过来的,可他竟然是用 ...

  2. 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)

    所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山....,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang ...

  3. animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画

    通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...

  4. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  5. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  6. 自己来实现一个简易的OCR

    来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...

  7. 换个角度看微信小程序[推荐]

    去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...

  8. mysql join 和left join 对于索引的问题

    今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_ ...

  9. Atitit ftp原理与解决方案

    Atitit ftp原理与解决方案 Deodeo sh shmayama ..search ftp.. 1. http和ftp都只是通信协议,就是只管传输那一块的,那为什么不能使用ftp来显示网页?? ...

随机推荐

  1. hive 批量添加,删除分区

    一.批量添加分区:   use bigdata; alter table siebel_member add if not exists partition(dt='20180401') locati ...

  2. 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题

    分布式全局唯一ID生成策略​ https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...

  3. @AspectJ注解的value属性

    @Component @Scope("prototype") @Aspect(value="perthis(execution(* com.helius.service. ...

  4. 使用 Jest 和 Supertest 进行接口端点测试

    如何创建测试是一件困难的事.网络上有许多关于测试的文章,却从来不告诉你他们是如何开始创建测试的. 所以,今天我将分享我在实际工作中是如何从头开始创建测试的.希望能够对你提供一些灵感. 目录: 使用 E ...

  5. K8S学习笔记之Grafana App for Kubernetes的配置

    Grafana有一套针对Kubernetes监控的APP,和Grafana-Zabbix App类似,但是配置咋一看比较麻烦,主要参数都是来自K8S. 这款APP的详细介绍请参考Grafana App ...

  6. 树莓派4B安装Raspbian系统及配置

    2019/11/11, 树莓派4B, Raspbian Buster 摘要:给树莓派4B安装系统及基础配置 树莓派实验室参考文档 准备工具 树莓派4B硬件 SD卡格式化工具 SD Formatter ...

  7. dapper.common新增概念object to sql

    Dapper.Common About author Email:@qq.com QQ: QQGroup: Config DbContextFactory.AddDataSource(new Data ...

  8. Vertx的命令行

    IntelliJ----创建一个运行配置(Application), 用io.vertx.core.Launcher类作为主类,在程序参数输入:run your-verticle-fully-qual ...

  9. jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒子(重要),jq操作滚动条

    jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒 ...

  10. 函数内this指向+排序+找出数组大小项+Math类

    解决函数内this指向: 1,可以在函数外提前声明变量 _this/that = this 2,通过apply()和call()来修改函数内的this指向 二者区别: 用法是一样的,参数形式不一样 f ...