线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连

  • Quad Tiling
    • description
    • solution
    • code
  • [Hnoi2010]Bus 公交线路
    • description
    • solution
    • code

Quad Tiling

description

solution

dpi,S:dp_{i,S}:dpi,S: iii列的状态为SSS的方案数,最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(1<<4)1(最后一列刚好铺满)

  • [0000]→[1001]/[0000]/[0011]/[1111]/[1100]\begin{bmatrix} 0\\ 0\\ 0\\ 0 \end{bmatrix} \rightarrow \begin{bmatrix} 1\\ 0\\ 0\\ 1\\ \end{bmatrix} / \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ \end{bmatrix} / \begin{bmatrix} 0\\ 0\\ 1\\ 1\\ \end{bmatrix} / \begin{bmatrix} 1\\ 1\\ 1\\ 1\\ \end{bmatrix} / \begin{bmatrix} 1\\ 1\\ 0\\ 0\\ \end{bmatrix} 00001001/0000/0011/1111/1100

  • [1111]→[0000]\begin{bmatrix} 1\\ 1\\ 1\\ 1\\ \end{bmatrix} \rightarrow \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ \end{bmatrix} 11110000

  • [1001]→[0110]/[0000]\begin{bmatrix} 1\\ 0\\ 0\\ 1 \end{bmatrix} \rightarrow \begin{bmatrix} 0\\ 1\\ 1\\ 0\\ \end{bmatrix} / \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ \end{bmatrix} 10010110/0000

  • [0110]→[1001]\begin{bmatrix} 0\\ 1\\ 1\\ 0 \end{bmatrix} \rightarrow \begin{bmatrix} 1\\ 0\\ 0\\ 1\\ \end{bmatrix} 01101001

  • [1100]→[0011]/[0000]\begin{bmatrix} 1\\ 1\\ 0\\ 0 \end{bmatrix} \rightarrow \begin{bmatrix} 0\\ 0\\ 1\\ 1\\ \end{bmatrix} / \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ \end{bmatrix} 11000011/0000

  • [0011]→[1100]/[0000]\begin{bmatrix} 0\\ 0\\ 1\\ 1\\ \end{bmatrix} \rightarrow \begin{bmatrix} 1\\ 1\\ 0\\ 0\\ \end{bmatrix} / \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ \end{bmatrix} 00111100/0000

  • 1010→0101...1010\rightarrow 0101...10100101...等的其余状态都是不可能最后刚好nnn被多米诺骨牌铺满而不凸出去几格的

在这里插入图片描述

code

#include <cstdio>
#include <cstring>
#define int long long
int n, mod;
struct matrix {int n, m;int c[16][16];matrix() {memset( c, 0, sizeof( c ) );}matrix operator * ( matrix &t ) {matrix ans;ans.n = n, ans.m = t.m;for( int i = 0;i < n;i ++ )for( int j = 0;j < t.m;j ++ )for( int k = 0;k < m;k ++ )ans.c[i][j] = ( ans.c[i][j] + c[i][k] * t.c[k][j] ) % mod;return ans;}
}g, ret;
int id[2][2][2][2];matrix qkpow( matrix x, int y ) {matrix ans;ans.n = ans.m = x.m;for( int i = 0;i < ans.n;i ++ )ans.c[i][i] = 1;while( y ) {if( y & 1 ) ans = ans * x;x = x * x;y >>= 1;}return ans;
}void rebuild() {memset( g.c, 0, sizeof( g.c ) );memset( ret.c, 0, sizeof( ret.c ) );g.n = g.m = ret.m = 1 << 4, ret.n = 1;g.c[id[0][0][0][0]][id[1][1][0][0]] = 1;g.c[id[0][0][0][0]][id[0][0][1][1]] = 1;g.c[id[0][0][0][0]][id[1][0][0][1]] = 1;g.c[id[0][0][0][0]][id[1][1][1][1]] = 1;g.c[id[0][0][0][0]][id[0][0][0][0]] = 1;g.c[id[0][0][1][1]][id[1][1][0][0]] = 1;g.c[id[0][0][1][1]][id[0][0][0][0]] = 1;g.c[id[1][1][0][0]][id[0][0][0][0]] = 1;g.c[id[1][1][0][0]][id[0][0][1][1]] = 1;g.c[id[1][0][0][1]][id[0][0][0][0]] = 1;g.c[id[1][0][0][1]][id[0][1][1][0]] = 1;g.c[id[0][1][1][0]][id[1][0][0][1]] = 1;g.c[id[1][1][1][1]][id[0][0][0][0]] = 1;ret.c[0][id[0][0][0][0]] = 1;
}signed main() {for( int i = 0;i < 2;i ++ )for( int j = 0;j < 2;j ++ )for( int k = 0;k < 2;k ++ )for( int w = 0;w < 2;w ++ )id[i][j][k][w] = w + ( 1 << 1 ) * k + ( 1 << 2 ) * j + ( 1 << 3 ) * i;while( scanf( "%lld %lld", &n, &mod ) ) {if( ! n && ! mod ) return 0;rebuild();g = qkpow( g, n );ret = ret * g;printf( "%lld\n", ret.c[0][id[0][0][0][0]] );}return 0;
}

[Hnoi2010]Bus 公交线路

description

solution

dpi,S:dp_{i,S}:dpi,S:i−1i-1i1个站都已经被有且访问过一次,然后[i,i+p−1][i,i+p-1][i,i+p1]的站的访问状态为SSS

SSS从高到低第jjj位代表i+j−1i+j-1i+j1车站的访问状态)

dpi,S→dpi+1,S′:dp_{i,S}\rightarrow dp_{i+1,S'}:dpi,Sdpi+1,S: 必须满足SSS的最高位为111且车站访问状态翻译过来是一样的

也就是说原来SSS的第jjj位,变成了S′S'S中的第j−1j-1j1

枚举下一个被访问的车站,要满足该车站的状态原来是000

最后套矩阵加速

code

#include <cstdio>
#include <cstring>
#define mod 30031
struct matrix {int n, m;int c[130][130];matrix() {memset( c, 0, sizeof( c ) );}matrix operator * ( matrix &t ) {matrix ans;ans.n = n, ans.m = t.m;for( int i = 1;i <= n;i ++ )for( int j = 1;j <= t.m;j ++ )for( int k = 1;k <= m;k ++ )ans.c[i][j] = ( ans.c[i][j] + c[i][k] * t.c[k][j] ) % mod;return ans;}
}g, ret;
int n, k, p, tot;
int s[130];matrix qkpow( matrix x, int y ) {matrix ans;ans.n = ans.m = x.n;for( int i = 1;i <= ans.n;i ++ )ans.c[i][i] = 1;while( y ) {if( y & 1 ) ans = ans * x;x = x * x;y >>= 1;}return ans;
}int main() {scanf( "%d %d %d", &n, &k, &p );for( int i = ( 1 << p - 1 );i < ( 1 << p );i ++ ) {int cnt = 0;for( int j = 0;j < p;j ++ )if( 1 << j & i ) cnt ++;if( cnt == k ) s[++ tot] = i;}g.n = g.m = ret.m = tot, ret.n = 1;ret.c[1][tot] = 1;for( int i = 1;i <= tot;i ++ )for( int j = 1;j <= tot;j ++ ) {int New = s[i] - ( 1 << p - 1 ) << 1;for( int w = 0;w < p;w ++ )if( ! ( 1 << w & New ) && New + ( 1 << w ) == s[j] ) {g.c[i][j] = 1;break;}}g = qkpow( g, n - k );ret = ret * g;printf( "%d\n", ret.c[1][tot] );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在ASP.NET Core程序启动时运行异步任务(2)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 2)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu在我的上一篇博客中&#xff0c;我介绍了如何在ASP.NET Core应用程序启动时运行一些一次性异步任务。本篇博客将继续讨论上一篇的内容&…

线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

动态DP——广义矩阵加速SP1716 GSS3 - Can you answer these queries IIIdescriptionsolutioncode[NOIP2018 提高组] 保卫王国descriptionsolutioncode动态DP能矩阵加速要满足外层操作符对内层操作符具有分配率加法对于乘法就具有分配率(ab)*ca*cb*c SP1716 GSS3 - Can you a…

.Net Core跨平台应用研究-HelloArm(串口篇)

引言为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行&#xff0c;针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证研究。硬件环境硬件系统经过对比筛选&#xff0c;选用了友善之臂出品的NanoPC-T3 Plus…

[数论系列一]C Looooops,跳跳棋,The Luckiest number,CF906D Power Tower,Minimal Power of Prime,仪仗队,LCMSUM

文章目录C Looooopsdescriptionsolutioncode跳跳棋descriptionsolutioncodeThe Luckiest numberdescriptionsolutioncodeCF906D Power TowerdescriptionsolutioncodeMinimal Power of Primedescriptionsolutioncode[SDOI2008]仪仗队descriptionsolutioncodeLCMSUMdescriptionso…

.NET Core使用微软AI认知服务识别文字语言

点击上方蓝字关注“汪宇杰博客”识别一段文字的语言有多种途径&#xff0c;在这个以AI为热点的时代&#xff0c;我们也可以给自己的应用强行加上AI&#xff0c;然后就能加上“智慧”的名字“自主研发成功”后去吹牛逼。今天我带大家来看看如何使用微软智慧云Azure提供的AI认知服…

【NET CORE微服务一条龙应用】第二章 配置中心使用

背景系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在分布式或者微服务系统里&#xff0c;通过配置文件来管理配置内容&#xff0c;是一件比较令人痛苦的事情&#xff0c;再谨慎也有湿鞋的时候&#xff0c;这就是在项目架构发展的过程中&#xff0c;配置中心存…

D - ABC Conjecture Gym - 102798D

D - ABC Conjecture Gym - 102798D 题意&#xff1a; 规定rad(n)n的所有质因子的乘积 给你一个c&#xff0c;问能否构造a和b使得abc且rad(abc)<c 题解&#xff1a; 先说结论&#xff0c;如果c可以拆分出两个一样的质因子&#xff0c;则能构造a和b 即 np1a1 * p2a2 . . .…

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫《马桶》&#xff0c;其中有一句歌词是&#xff1a;每一个马桶都是英雄。EFCore也有一个英雄&#xff0c;在幕后默默地任劳任怨。它就叫 "支持字段" (Backing Fields):中文版&#xff1a;https://docs.microsoft.com/zh-cn/ef/core/modeling/backin…

数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

[SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式&#xff0c;考虑化成等比数列 xi1ka(xik)a⋅xibt⇒kba−1x_{i1}ka(x_ik)ax_ibt\Rightarrow k\frac{b}{a-1}xi1​ka(xi​k)a⋅xi​bt⇒ka−1b​ ⇒xiba−1ai−1(x1ba−…

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…

API标准化成为技术团队面临的最大挑战

调查表明&#xff0c;API 标准化成为了技术团队面临的最大挑战。SmartBear 发布了 2019 年 API 状态报告“The State of API 2019”&#xff0c;此报告旨在为 API 行业建立关于软件团队在 2019 年规划、设计、开发、测试、记录和监控 API 的方法、实践和工具的基准。此次调查有…

线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

多类型高斯消元杂题[SDOI2010]外星千足虫descriptionsolutioncode[HNOI2013]游走descriptionsolutioncode[HNOI2011]XOR和路径descriptionsolutioncodeMaze(树上高斯消元)problemsolutioncode[SDOI2010]外星千足虫 description solution 高斯消元的模板题 虽然感觉问了个最…

Ocelot 资源汇总

前言最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多&#xff0c;Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认可&#xff0c;应用到生产中的案例也有好几百了。春节抽空整理了现有网上公开的Ocelot相关的资…

[TJOI2017]城市(未解决)

[TJOI2017]城市 题意&#xff1a; 一棵树&#xff0c;现在要求你将一条边改变他的位置&#xff0c;&#xff08;即改变左右所连接的端点&#xff0c;权值不变&#xff09;&#xff0c;修改后任意两点相互可达&#xff0c;且使得两个点之间的最大交通费用最小 题解: 有O(n^2…

数论三之组合数学Ⅰ-Max-Min Sums,Binomial Coefficient is Fun,Strivore,Bubble Sort,放棋子,LOJ6671,Iroha and a Grid

组合计数我最爱Max-Min SumsdescriptionsolutioncodeBinomial Coefficient is FundescriptionsolutioncodeStrivoredescriptionsolutioncodeBubble Sortdescriptionsolutioncode[HAOI2016]放棋子descriptionsolutioncodeEntropyIncreaser 与 MinecraftdescriptionsolutioncodeD…

语言之争与读书有感

移动互联网无处不在的今天&#xff0c;不同的学习方式让我们受益颇多。有人喜欢通过手机阅读各类技术专家的公众号分享&#xff1b;有人喜欢通过逛逛不同的博客&#xff0c;来了解当前时下的技术&#xff1b;也有人喜欢通过社区的形式&#xff0c;跟优秀的导师们一起梳理和发展…

CF566E-Restoring Map【bitset】

正题 题目链接:https://www.luogu.com.cn/problem/CF566E 题目大意 有一棵树&#xff0c;但是你不知道它的形态。你现在只知道距离每个点距离不超过222的点集&#xff0c;但是你不知道每个点集是对应哪个点的。 现在要你求这棵树。 2≤n≤10002\leq n\leq 10002≤n≤1000 解…

所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市

今天是春节假期的最后一天&#xff0c;在这里给全国的朋友们拜个晚年&#xff0c;祝大家身体健康&#xff0c;晚年幸福啊。这个春节大家过的怎么样啊&#xff0c;我自己是在老家过的年&#xff0c;家乡的年味还是比较浓的&#xff0c;也再次感谢朋友圈的大家给我看了各地的风光…

数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

丝且人一口Virus Tree 2descriptionsolutioncodeRGB Coloringdescriptionsolutioncode123 Triangledescriptionsolutioncode[SDOI2016]排列计数descriptionsolutioncode[HNOI2012]排队descriptionsolutioncode[HNOI2011]卡农descriptionsolutioncodeVirus Tree 2 description …