test20191020 往复
往复
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 往复的更多相关文章
- 记一次Pr中视频蜜汁卡顿往复和解决方法
目录 问题 换素材的起因 灵异素材 无端联想 解决 问题 换素材的起因 本来视频剪了一晚剪完了,导出一看,好家伙,糊到上世纪.原来素材的像素大小都没法看,这视频素材我是从别人U盘拷过来的,可他竟然是用 ...
- 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)
所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山....,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang ...
- animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画
通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- 自己来实现一个简易的OCR
来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...
- 换个角度看微信小程序[推荐]
去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...
- mysql join 和left join 对于索引的问题
今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_ ...
- Atitit ftp原理与解决方案
Atitit ftp原理与解决方案 Deodeo sh shmayama ..search ftp.. 1. http和ftp都只是通信协议,就是只管传输那一块的,那为什么不能使用ftp来显示网页?? ...
随机推荐
- c# 创建socket连接辅助类-可指定超时时间
using AD.SocketForm.Model; using NLog; using System; using System.Net.Sockets; using System.Threadin ...
- linux 远程文件复制和拉取
基本命令格式 上传 scp -r myfilder tiantian@192.168.168.221:/home/tiantian/temp/ 复制本地文件到远程/home/tiantian/te ...
- 算法:线性查找(重点isFlag标志)
package com.atguigu; public class Main { public static void main(String[] args) { String[] arr=new S ...
- python解决使用镜像源来安装包
一.问题在进行python包安装的时候出现一个问题就是无法进行安装,且出现了如下的错误 报错代码 Retrying (Retry(total=4, connect=None, read=None, r ...
- java基础 接口常量
/** * 接口当中也可以定义"成员变量", 但是必须使用public static final三个关键字进行修饰 * 从效果上看,这其实就是接口的[常用] * 格式: * pub ...
- C# LINQ干掉for循环
public void OldSum() { ; ; i < ; i++) { sum0 += i; } Assert.AreEqual(, sum0); } public void NewSu ...
- C++ 中的静态成员函数与静态成员变量
于CSDN 2014-01-17 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volu ...
- 使用EF Core+CodeFirst建立ASP.NET Core MVC项目
本篇随笔介绍如何使用.NET Core+EF Core创建Web应用程序 首先借用官网的话简单介绍一下ASP.NET Core ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且 ...
- ES6 之 对象的简写方式
简写有两条基本原则: 同名的属性可以省略不写 对象中的方法中的 : function 可以省略不写 来看下下面这个例子,我分别用ES5 和 ES6 的语法分别定义并声明了一个简单的学生对象: ES5: ...
- 2. vue基础-vue-cli(vue脚手架)
1. 作用 快速创建一个基于webpack模板的项目 2. 安装工具 安装webpack:使用npm全局安装webpack,打开命令行工具,输入 npm install webpack -g,安装 ...