暂无链接

三米诺

题目背景

金企鹅同学非常擅长用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] 三米诺相关推荐

  1. 九校联考-DL24 凉心模拟 Day1T3 三米诺 (tromino)

    题目描述 金企鹅同学非常擅长用 1×21×21×2 的多米诺骨牌覆盖棋盘的题.有一天,正在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺 (domino)",那么三个格子的的 ...

  2. 九校联考-DL24凉心模拟Day1T3 三米诺 (tromino)

    题目背景 金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题.有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺(domino)",那 么三个格子的的积木一定叫&q ...

  3. 10.02 T3 打表找递推式+十进制快速幂 九校联考凉心模拟DAY1T1

    题目背景 金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题.有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺(domino)",那 么三个格子的的积木一定叫&q ...

  4. LeetCode 838. 推多米诺(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相 ...

  5. Leetcode 838. 推多米诺 C++

    Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻 ...

  6. Java实现 LeetCode 838 推多米诺(暴力模拟)

    838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...

  7. 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期

    三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...

  8. 多米诺骨牌上演:三箭资本崩盘始末

    原文作者:Daniel Li 三箭资本,我们一般称他为 3AC,是世界上最大的以加密货币为重点的对冲基金公司之一.由Su Zhu和Kyle Davies于 2012 年创立,两人是高中同学,均为投行背 ...

  9. 证券期货经营机构私募资产管理业务管理办法 2018年10月22日

    证券期货经营机构私募资产管理业务 管理办法 目 录 第一章 总则 第二章 业务主体 第三章 业务形式 第四章 非公开募集 第五章 投资运作 第六章 信息披露 第七章 变更.终止与清算 第八章 风险管理 ...

  10. 1026. 多米诺和三格骨牌铺瓦问题

    1026. 多米诺和三格骨牌铺瓦问题 我们有两种瓷砖:一种 2x1 多米诺形状,一种"L"型三格骨牌形状.这些形状可以被旋转. XX <- 多米诺 XX <- 三格骨牌 ...

最新文章

  1. java多线程消息队列_java多线程消息队列的实现
  2. 解决spring和struts配合问题
  3. java各个版本的特性_Java各个版本的新特性
  4. 42张PPT揭秘字节跳动人力资源体系(推荐收藏)
  5. vant组件做表格_落户上海!分享心得,再做个积分计算器
  6. “WiFi 万能钥匙”盗 9 亿用户数据,如何看待运营平台滥用隐私的问题?
  7. 阿里云前端周刊 - 第 37 期
  8. Server 2008 R2远程桌面授权
  9. Audio -- Music Playback 框图
  10. Android 性能分析工具介绍
  11. 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
  12. GIF动画录制工具(写教程时用的比较小巧的gif工具)
  13. Java开发常见专业术语
  14. Photoshop CS6 安装教程
  15. ndo2db: Warning: Retrying message send. This can occur
  16. ajax富客户端存在的意义,基于AJAX的网上银行富客户端研究与设计
  17. Apple watch ,小米微信通知
  18. android电子书大全 下载
  19. ffmpeg给视频添加时间水印
  20. 十大监控工具,值得一试

热门文章

  1. 卡方分布的定义与概率密度的计算
  2. java ArrayList添加元素全部一样
  3. 正则表达式验证输入用户名格式是否正确
  4. poj 3280 Cheapest Palindrome (dp)
  5. Linux环境进程间通信(一)管道和FIFO
  6. android 屏幕宽高
  7. linux中文件带方块,JFreeChart图片里的中文在linux下显示为方块的解决办法
  8. Docker批量拉取和推送的Linux Shell脚本
  9. Mybatis foreach逗号分隔字符串遍历方式
  10. Redis与Redisson的分布式锁