[2018.10.10 T3] 三米诺
暂无链接
三米诺
题目背景
金企鹅同学非常擅长用1×21 × 21×2的多米诺骨牌覆盖棋盘的题。有一天,正在背四六级单词的他忽然想:既然两个格子的积木叫“多米诺 (domino)”,那么三个格子的的积木一定叫“三米诺 (tromino)”了!用三米诺覆盖棋盘的题怎么做呢?
题目描述
用三米诺覆盖3×n3 × n3×n的矩形棋盘,共多少种方案?三米诺可旋转;两种方案不同当且仅当这两种图案直接覆盖在一起无法重叠。
例如n=2n = 2n=2时,共333种方案:
用三米诺覆盖3×2棋盘用三米诺覆盖3\times 2棋盘用三米诺覆盖3×2棋盘
格式
输入格式
一行一个整数n(n≤1040000)n(n ≤ 10^{40000})n(n≤1040000),表示棋盘列数。
输出格式
一行一个整数,表示方案数,对998244353998244353998244353取模。
样例
样例 1 输入
2
样例 1 输出
3
样例 2 输入
3
样例 2 输出
10
样例 3 输入
29
样例 3 输出
543450786
数据范围
对于10%10\%10%的数据,n≤5n ≤ 5n≤5;
对于30%30\%30%的数据,n≤106n ≤ 10^6n≤106;
对于40%40\%40%的数据,n≤20001000n ≤ 20001000n≤20001000;
对于60%60\%60%的数据,n≤109n ≤ 10^9n≤109;
对于80%80\%80%的数据,n≤101000n ≤ 10^{1000}n≤101000;
对于100%100\%100%的数据,n≤1040000n ≤ 10^{40000}n≤1040000。
题解
借鉴多米诺的思路,我们很容易想到长度为1,2,31,2,31,2,3的转移,然而三米诺的精髓在于存在弯折的形状,这使三米诺可以将几个长条错起来放,不需要像多米诺一样长条必须并排放置。
于是出现了下面三种奇妙的转移:
你会发现它们都是可以无限延伸且不重不漏的,要dpdpdp统计答案的话,可能是O(n2)O(n^2)O(n2)的。。。
这个时候你可以暴力算前几项,然后 上OEIS通过高斯消元把递推系数解出来,得到正确的递推式:
论一个熟练的OEISer如何快速AC此题。
神犇Rockud\mathcal{Rockud}Rockud还有一个牛逼哄哄的维护了三个前缀和的递推做法,作为蒟蒻只能%%%\%\%\%%%%。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=4e5,N=6,mod=998244353;
struct sd{ll sq[N+2][N+2];}c,one,base,ans,ni,r;
int mat[N+1][N+1]={0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,2,0,1,0,0,0,0,6,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,-1,0,0,0,0,0};
int fan[N+1][N+1]={0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,1,0,0,1,0,0,0,2,0,0,0,1,0,0,6,0,0,0,0,1,0,1,0,0,0,0,0,1,0};
int f[]={1,1,3,10,23,62,170};
ll AC,len;
char num[M];
sd operator*(sd a,sd b){for(int i=1,j,k;i<=N;++i)for(j=1;j<=N;++j)for(c.sq[i][j]=0,k=1;k<=N;++k)(c.sq[i][j]+=a.sq[i][k]*b.sq[k][j]%mod)%=mod;return c;}
sd power(sd a,int p){for(r=one;p;p>>=1,a=a*a)if(p&1)r=r*a;return r;}
void in(){scanf("%s",num+1);}
void ac()
{if((len=strlen(num+1))==1&&num[1]-'0'<=6){printf("%d",f[num[1]-'0']);return;}for(int i=1;i<=N;++i)ans.sq[i][i]=one.sq[i][i]=1;for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)base.sq[i][j]=mat[i][j],ni.sq[i][j]=fan[i][j];for(int i=len;i;--i)ans=ans*power(base,num[i]-'0'),base=power(base,10);ans=ans*power(ni,6);for(int i=1;i<=N;++i)(AC+=ans.sq[i][1]*f[N-i+1]%mod)%=mod;printf("%lld\n",(AC+mod)%mod);
}
int main(){in(),ac();}
[2018.10.10 T3] 三米诺相关推荐
- 九校联考-DL24 凉心模拟 Day1T3 三米诺 (tromino)
题目描述 金企鹅同学非常擅长用 1×21×21×2 的多米诺骨牌覆盖棋盘的题.有一天,正在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺 (domino)",那么三个格子的的 ...
- 九校联考-DL24凉心模拟Day1T3 三米诺 (tromino)
题目背景 金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题.有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺(domino)",那 么三个格子的的积木一定叫&q ...
- 10.02 T3 打表找递推式+十进制快速幂 九校联考凉心模拟DAY1T1
题目背景 金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题.有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺(domino)",那 么三个格子的的积木一定叫&q ...
- LeetCode 838. 推多米诺(模拟)
文章目录 1. 题目 2. 解题 1. 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相 ...
- Leetcode 838. 推多米诺 C++
Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻 ...
- Java实现 LeetCode 838 推多米诺(暴力模拟)
838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...
- 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期
三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...
- 多米诺骨牌上演:三箭资本崩盘始末
原文作者:Daniel Li 三箭资本,我们一般称他为 3AC,是世界上最大的以加密货币为重点的对冲基金公司之一.由Su Zhu和Kyle Davies于 2012 年创立,两人是高中同学,均为投行背 ...
- 证券期货经营机构私募资产管理业务管理办法 2018年10月22日
证券期货经营机构私募资产管理业务 管理办法 目 录 第一章 总则 第二章 业务主体 第三章 业务形式 第四章 非公开募集 第五章 投资运作 第六章 信息披露 第七章 变更.终止与清算 第八章 风险管理 ...
- 1026. 多米诺和三格骨牌铺瓦问题
1026. 多米诺和三格骨牌铺瓦问题 我们有两种瓷砖:一种 2x1 多米诺形状,一种"L"型三格骨牌形状.这些形状可以被旋转. XX <- 多米诺 XX <- 三格骨牌 ...
最新文章
- java多线程消息队列_java多线程消息队列的实现
- 解决spring和struts配合问题
- java各个版本的特性_Java各个版本的新特性
- 42张PPT揭秘字节跳动人力资源体系(推荐收藏)
- vant组件做表格_落户上海!分享心得,再做个积分计算器
- “WiFi 万能钥匙”盗 9 亿用户数据,如何看待运营平台滥用隐私的问题?
- 阿里云前端周刊 - 第 37 期
- Server 2008 R2远程桌面授权
- Audio -- Music Playback 框图
- Android 性能分析工具介绍
- 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
- GIF动画录制工具(写教程时用的比较小巧的gif工具)
- Java开发常见专业术语
- Photoshop CS6 安装教程
- ndo2db: Warning: Retrying message send. This can occur
- ajax富客户端存在的意义,基于AJAX的网上银行富客户端研究与设计
- Apple watch ,小米微信通知
- android电子书大全 下载
- ffmpeg给视频添加时间水印
- 十大监控工具,值得一试