题目背景

金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题。有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫“多米诺(domino)”,那 么三个格子的的积木一定叫“三米诺(tromino)”了!用三米诺覆盖棋盘的题 怎么做呢?

题目描述

用三米诺覆盖3n 的矩形棋盘,共多少种方案?三米诺可旋转;两种 方案不同当且仅当这两种图案直接覆盖在一起无法重叠。

输入输出格式

输入格式:

一行一个整数n(n<=10^40000),表示棋盘列数。

输出格式:

一行一个整数,表示方案数,对998244353 取模。

输入输出样例

输入样例#1

2

输出样例#1

3

输入样例#2

3

输出样例#2

10

输入样例#3

29

输出样例#3

543450786

说明

对于10% 的数据,n <=5;
对于30% 的数据,n <=10^6;
对于40% 的数据,n <=20001000;
对于60% 的数据,n <=10^9;
对于80% 的数据,n <=10^1000
对于100% 的数据,n<=10^40000。

这题先爆搜把前面几项打表出来,然后上OEIS高斯消元把各项系数求出来,设a(n)为填满前n列的方案最后其实你可以得到一个东西

很显然直接上矩阵快速幂就可以了

但是数字这么大没法快速幂,发现一般的快速幂是2进制,我们就写十进制快速幂套一个二进制快速幂就可以了,其实我写了很久好难啊woc怎么会有这种东西就是按位快速幂就可以了(逃

取模多加点数字。。。负数把我坑惨了,顺便因为前六项只能打表,所以矩阵要乘n-6次,但字符串不好操作于是乘上6次矩阵的逆就可以了

code:

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 using namespace std;
  5 const long long mod=998244353;
  6 struct matrix{
  7     long long a[7][7];
  8 };
  9 long long chang[7][7]={
 10     {0,0,0,0,0,0,0},
 11     {0,1,1,0,0,0,0},
 12     {0,2,0,1,0,0,0},
 13     {0,6,0,0,1,0,0},
 14     {0,1,0,0,0,1,0},
 15     {0,0,0,0,0,0,1},
 16     {0,-1,0,0,0,0,0},
 17 };
 18 long long fan[7][7]={
 19     {0,0,0,0,0,0,0},
 20     {0,0,0,0,0,0,-1},
 21     {0,1,0,0,0,0,1},
 22     {0,0,1,0,0,0,2},
 23     {0,0,0,1,0,0,6},
 24     {0,0,0,0,1,0,1},
 25     {0,0,0,0,0,1,0},
 26 };
 27 matrix mul(matrix a,matrix b){
 28     matrix c;
 29     memset(c.a,0,sizeof c.a);
 30     for(long long i=1;i<=6;i++){
 31         for(long long j=1;j<=6;j++){
 32             for(long long k=1;k<=6;k++){
 33                 c.a[i][j]+=(a.a[i][k]%mod*b.a[k][j])%mod;
 34                 c.a[i][j]%=mod;
 35             }
 36         }
 37     }
 38     return c;
 39 }
 40 matrix ksm(matrix a,long long b){
 41     matrix ans;
 42     memset(ans.a,0,sizeof ans.a);
 43     ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=ans.a[4][4]=ans.a[5][5]=ans.a[6][6]=1;
 44     for(;b;b>>=1){
 45     //    cout<<b<<'\n';
 46         if(b&1)ans=mul(ans,a);
 47         a=mul(a,a);
 48     }
 49     return ans;
 50 }
 51 void tiaoshi(matrix ans){
 52         for(long long i=1;i<=6;i++){
 53         for(long long j=1;j<=6;j++)
 54         cout<<ans.a[i][j]<<" ";
 55         cout<<'\n';
 56     }
 57 }
 58 int main(){
 59     freopen("tromino.in","r",stdin);
 60     freopen("tromino.out","w",stdout);
 61     string n;
 62     cin>>n;
 63     if(n.size()==1&&n[0]<='6'){
 64         if(n=="1")cout<<1;
 65         if(n=="2")cout<<3;
 66         if(n=="3")cout<<10;
 67         if(n=="4")cout<<23;
 68         if(n=="5")cout<<62;
 69         if(n=="6")cout<<170;
 70         return 0;
 71     }
 72     matrix base,ans;
 73     memset(ans.a,0,sizeof ans.a);
 74     memset(base.a,0,sizeof base.a);
 75     for(long long i=1;i<=6;i++)
 76         for(long long j=1;j<=6;j++)
 77             base.a[i][j]=chang[i][j];
 78     ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=ans.a[4][4]=ans.a[5][5]=ans.a[6][6]=1;
 79 //    for(long long i=1;i<=6;i++){
 80 //        for(long long j=1;j<=6;j++)
 81 //        cout<<base.a[i][j]<<" ";
 82 //        cout<<'\n';
 83 //    }
 84     for(long long i=n.size()-1;i>=0;i--){
 85         long long num=n[i]-'0';
 86     //    tiaoshi(ans);
 87     //    cout<<'\n';
 88     //    cout<<num<<endl;
 89         ans=mul(ans,ksm(base,num));
 90     //    tiaoshi(ans);
 91         base=ksm(base,10);
 92     }
 93     matrix ni;
 94     for(long long i=1;i<=6;i++)
 95         for(long long j=1;j<=6;j++)
 96             ni.a[i][j]=fan[i][j];
 97     for(long long i=1;i<=6;i++){
 98         ans=mul(ans,ni);
 99     }
100     cout<<(mod*3+ans.a[1][1]*170%mod+ans.a[2][1]*62%mod+ans.a[3][1]*23%mod+ans.a[4][1]*10%mod+ans.a[5][1]*3%mod+ans.a[6][1]*1%mod)%mod;
101     return 0;
102 }

优秀的复杂度(误

over

转载于:https://www.cnblogs.com/saionjisekai/p/9742200.html

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

  1. 牛客14607 递推(矩阵快速幂构造)

    链接:https://ac.nowcoder.com/acm/problem/14607 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...

  2. 铺地砖(找递推式 + 大数)

    铺地砖 时间限制: 1 Sec  内存限制: 128 MB 题目描述 一天,晨晨的数学老师布置了一道题目,大意如下:用1×1和2×2的磁砖不重叠地铺满n×3的地板,共有多少种方案? 例如:n=1时:1 ...

  3. UESTC - 1610 递推方程+矩阵快速幂

    感觉像是HDU Keyboard的加强版,先推出3张牌时的所有组合,然后递推出n张牌 看到n=1e18时吓尿了 最后24那里还是推错了.. (5行1列 dp[1][n],dp[2][n],dp[3][ ...

  4. 【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】

    题意:长度为 nnn 的环染 mmm 种颜色,要求任意相邻 mmm 个元素不能包含全部的颜色.求方案数 模 109+710^9+7109+7,循环同构. n≤109,m≤7n\leq 10^9,m\l ...

  5. [递推式求解、多指针、前缀和]XATU第七届算法大赛

    文章目录 赛后感想 1.2题略 3 乐华水上梦幻乐园之拖鞋失踪案[概率论.递推式求解] 题意 分析 代码 4.5.6.7.8题略 9 Ugly Number[多指针] 题意 做法1[BFS with ...

  6. 分治法 分治法求解递推式

    分治法 分治法基本就是下面的三步 分(divide):无法有效解决的划分更小的问题 治(conquer):递归求每一个子问题的解 合(combine):合并解得出原问题解 MergeSort:排列 1 ...

  7. 算法分析中递推式的一般代数解法

    算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式.例如汉诺塔问题的时间复杂度递推形式为T(n)=2T(n−1)+1(n≥1)T(n)=2T(n−1)+1(n≥1),可以解出封闭形 ...

  8. UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)

    题目:UVA-10253 题目翻译(来自蓝书): 串并联网络有两个端点,一个叫源,一个叫汇,递归定义如下: (1) 一条单独的边是串并联网络. (2) 若G1和G2是串并联网络,把它们的源和源接在一起 ...

  9. AcWing 885. 求组合数 I(递推式预处理)

    题面连接 https://www.acwing.com/problem/content/887/ 思路 通过组合数学的知识我们能知道Cab=Ca−1b+Ca−1b−1C_a^b = C_{a-1}^b ...

最新文章

  1. 0-1背包 java_0-1背包问题,java的动态规划如题,代码如下public
  2. C++静态库与动态库(简介)
  3. StarlingMVC Framework中文教程
  4. Granular Computing(粒计算)
  5. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图
  6. 【SpringBoot】【Thyemeleaf 】【Spring EL表达式】 SPEL调用静态类、静态方法
  7. 循环计算-02-0到100数字累加
  8. Jquery自定义分页插件
  9. druid链接mysql-proxy_MySQL读写分离之mysql-proxy
  10. truncate(can)
  11. prolog初学语法结构
  12. KICKSTART无人值守安装系统
  13. 移动光猫路由改桥接降低延时初尝试
  14. Ubuntu下键盘测试软件
  15. Windows安装ElasticSearch 7.3.0
  16. linux 将当前时间往后调整2分钟_linux调整系统时间 永久 z | 学步园
  17. WP7 SDK模拟器对应PC键盘的功能键
  18. 一寸Timing一寸金,寸金能买寸光阴——CCD
  19. LintCode 644. 镜像数字 JavaScript算法
  20. SDN初体验·理论篇(零):SDN与传统网络不得不说的那些事

热门文章

  1. MySQL - 存储引擎初探
  2. java图形界面猜字游戏,java程序,猜字游戏,希望大神帮忙
  3. 如何查看python解释器位置_Python:查看解释器的位置
  4. linux内核引入模块机制好处,linux内核模块的版本检查机制
  5. executequery方法_【接口测试】soapui中数字、字符串、日期时间、数据库连接参数化的设置方法...
  6. Docker安装部署ELK教程 (Elasticsearch+Kibana+Logstash+Filebeat)
  7. python 计算算术平方根
  8. MySQL---Subquery returns more than 1 row
  9. 2021-04-29 Python绘制柱状图之可视化神器Pyecharts
  10. 2021-03-01 Matlab 多项式的根求解