10.02 T3 打表找递推式+十进制快速幂 九校联考凉心模拟DAY1T1
题目背景
金企鹅同学非常擅长用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相关推荐
- 牛客14607 递推(矩阵快速幂构造)
链接:https://ac.nowcoder.com/acm/problem/14607 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...
- 铺地砖(找递推式 + 大数)
铺地砖 时间限制: 1 Sec 内存限制: 128 MB 题目描述 一天,晨晨的数学老师布置了一道题目,大意如下:用1×1和2×2的磁砖不重叠地铺满n×3的地板,共有多少种方案? 例如:n=1时:1 ...
- UESTC - 1610 递推方程+矩阵快速幂
感觉像是HDU Keyboard的加强版,先推出3张牌时的所有组合,然后递推出n张牌 看到n=1e18时吓尿了 最后24那里还是推错了.. (5行1列 dp[1][n],dp[2][n],dp[3][ ...
- 【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】
题意:长度为 nnn 的环染 mmm 种颜色,要求任意相邻 mmm 个元素不能包含全部的颜色.求方案数 模 109+710^9+7109+7,循环同构. n≤109,m≤7n\leq 10^9,m\l ...
- [递推式求解、多指针、前缀和]XATU第七届算法大赛
文章目录 赛后感想 1.2题略 3 乐华水上梦幻乐园之拖鞋失踪案[概率论.递推式求解] 题意 分析 代码 4.5.6.7.8题略 9 Ugly Number[多指针] 题意 做法1[BFS with ...
- 分治法 分治法求解递推式
分治法 分治法基本就是下面的三步 分(divide):无法有效解决的划分更小的问题 治(conquer):递归求每一个子问题的解 合(combine):合并解得出原问题解 MergeSort:排列 1 ...
- 算法分析中递推式的一般代数解法
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式.例如汉诺塔问题的时间复杂度递推形式为T(n)=2T(n−1)+1(n≥1)T(n)=2T(n−1)+1(n≥1),可以解出封闭形 ...
- UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)
题目:UVA-10253 题目翻译(来自蓝书): 串并联网络有两个端点,一个叫源,一个叫汇,递归定义如下: (1) 一条单独的边是串并联网络. (2) 若G1和G2是串并联网络,把它们的源和源接在一起 ...
- AcWing 885. 求组合数 I(递推式预处理)
题面连接 https://www.acwing.com/problem/content/887/ 思路 通过组合数学的知识我们能知道Cab=Ca−1b+Ca−1b−1C_a^b = C_{a-1}^b ...
最新文章
- 0-1背包 java_0-1背包问题,java的动态规划如题,代码如下public
- C++静态库与动态库(简介)
- StarlingMVC Framework中文教程
- Granular Computing(粒计算)
- python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图
- 【SpringBoot】【Thyemeleaf 】【Spring EL表达式】 SPEL调用静态类、静态方法
- 循环计算-02-0到100数字累加
- Jquery自定义分页插件
- druid链接mysql-proxy_MySQL读写分离之mysql-proxy
- truncate(can)
- prolog初学语法结构
- KICKSTART无人值守安装系统
- 移动光猫路由改桥接降低延时初尝试
- Ubuntu下键盘测试软件
- Windows安装ElasticSearch 7.3.0
- linux 将当前时间往后调整2分钟_linux调整系统时间 永久 z | 学步园
- WP7 SDK模拟器对应PC键盘的功能键
- 一寸Timing一寸金,寸金能买寸光阴——CCD
- LintCode 644. 镜像数字 JavaScript算法
- SDN初体验·理论篇(零):SDN与传统网络不得不说的那些事
热门文章
- MySQL - 存储引擎初探
- java图形界面猜字游戏,java程序,猜字游戏,希望大神帮忙
- 如何查看python解释器位置_Python:查看解释器的位置
- linux内核引入模块机制好处,linux内核模块的版本检查机制
- executequery方法_【接口测试】soapui中数字、字符串、日期时间、数据库连接参数化的设置方法...
- Docker安装部署ELK教程 (Elasticsearch+Kibana+Logstash+Filebeat)
- python 计算算术平方根
- MySQL---Subquery returns more than 1 row
- 2021-04-29 Python绘制柱状图之可视化神器Pyecharts
- 2021-03-01 Matlab 多项式的根求解