牛客练习赛27 F-计数(状压+限制初末状态的矩阵快速幂)
传送门
假如不是环,很简单
定义f[i][j]f[i][j]f[i][j]枚举到第iii个数字最后五个数字状态是jjj
那么显然可以矩阵快速幂求解
初始矩阵aaa是111行(1<<m)−1(1<<m)-1(1<<m)−1列,若状态iii合法
就令a[1][i]=1a[1][i]=1a[1][i]=1
转移矩阵bbb是(1<<m)−1(1<<m)-1(1<<m)−1行(1<<m)−1(1<<m)-1(1<<m)−1列,若iii能转移到jjj
就令b[i][j]=1b[i][j]=1b[i][j]=1
这样最后乘起来得到一个111行(1<<m)−1(1<<m)-1(1<<m)−1列的矩阵ccc
c[1][i]c[1][i]c[1][i]表示最后五个数状态是iii的方案数
回到环形上来,唯一的区别在于末尾元素可以和开头元素相邻
那我们直接枚举开头状态和末尾状态
末尾状态在ccc的含义中已经知道了,但是不确定开头状态
其实只需要不乘初始矩阵就好了
b[i][j]b[i][j]b[i][j]的含义就是开头状态是iii,末尾状态是jjj的方案数
因为让a∗ba*ba∗b的过程中,就是累加每一种开头得到矩阵ccc
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,maxx;
const int mod = 998244353;
struct rce
{int m[35][35];rce(){ memset(m,0,sizeof m); }
};
rce operator * (rce a,rce b)
{rce ans;for(int i=0;i<maxx;i++)for(int j=0;j<maxx;j++)for(int k=0;k<maxx;k++)ans.m[i][j] = ( ans.m[i][j]+a.m[i][k]*b.m[k][j]%mod )%mod;return ans;
}
rce init()
{rce ans;for(int i=0;i<maxx;i++) ans.m[i][i] = 1;return ans;
}
rce quick(rce x,int n)
{rce ans = init();for( ; n ; n>>=1,x=x*x )if( n&1 ) ans = ans*x;return ans;
}
bool isok(int x)
{int one = 0;for(int i=0;i<m;i++)if( (1<<i)&x ) one++;//1表示3return one<=m-one;
}
bool check(int q,int w)
{for(int i=1;i<m;i++)//枚举每一位 {int one = 0; for(int j=i;j<m;j++) if( q&(1<<(m-j-1)) ) one++;for(int j=0;j<i;j++) if( w&(1<<(m-j-1)) ) one++;// cout << one << endl;if( one>m-one ) return false;}return true;
}
signed main()
{cin >> n >> m;maxx = (1<<m);rce chu,gou;for(int i=0;i<maxx;i++) chu.m[1][i] = isok(i);for(int i=0;i<maxx;i++)for(int j=0;j<maxx;j++){if( !isok(i)||!isok(j) ) continue;int x = i&((1<<(m-1))-1);if( x==(j>>1) ) gou.m[i][j] = 1;}gou = quick( gou,n-m );int ans = 0;for(int i=0;i<maxx;i++)//初状态 for(int j=0;j<maxx;j++)//末状态 {if( !isok(i)||!isok(j) ) continue;if( !check(j,i) ) continue;ans = ( ans+gou.m[i][j] )%mod;}cout << ans;
}
牛客练习赛27 F-计数(状压+限制初末状态的矩阵快速幂)相关推荐
- 牛客练习赛$18E\ pocky$游戏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ 首先注意下题目,这个$a_i$不是个排列,,,我开始想了好久说这不是傻逼题直接做嘛然后一看样例发现我是傻逼$/dk$ 一个套路,看到绝对值问题一般就是 ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛29: F. 算式子
链接:https://www.nowcoder.com/acm/contest/211/F 来源:牛客网 题目描述 给定 个整数 .保证 . 对于每个 ,求出 .为了避免过量输出,你只需要将所 ...
- 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg(分治NTT)
一些废话: 写完上一题(分治FFT)之后记起之前牛客写的这道题,题解是用启发式NTT,每次选两个项数最小的合并,当时没有整理NTT的模板所以就先mark了,今天受到分治FFT的启发,想用分治NTT来解 ...
- 牛客练习赛 43 F Tachibana Kanade Loves Game 容斥原理(Java版ac)
链接:https://ac.nowcoder.com/acm/contest/548/F 来源:牛客网 题目描述 立华奏是一个天天打比赛的萌新. 省选将至,萌新立华奏深知自己没有希望进入省队,因此开始 ...
- 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)
链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...
- 牛客练习赛27 B 手办
题意 给你一个n 定义f(x)为a*b整除x的(a,b)个数 求f(1)+f(2)+-+f(n) 废话 好久没有更博客了.. 其实都是写了没有发出来.. 你问我为什么不发出来? 因为写得都很简略..类 ...
- 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】
传送门:算式子 花了一些时间理解AC的代码,震惊,代码真的是短小精悍,推理能力很强亦或者是做题多,见的多. 能够理解里面的逻辑真的挺难的 题意 给定n,m,\(1\le x\le m\),求\(\su ...
- 牛客练习赛71 F 红蓝图(kruskal重构树)
红蓝图 给定两个参数x,tx, tx,t,删除边权大于ttt的红边,和边权小于ttt的蓝边,问对于所有的点yyy,既能通过红边走向xxx,又能通过蓝边走向xxx,的点有多少个. 考虑对红边按照边权升序 ...
最新文章
- Ubuntu 上安装rust
- oracle创建定时任务
- 有关WriteableBitmap和BitmapImage之间的相互转换
- 分析android动画模块
- TensorFlow 1.0正式发布
- 2020 年 4 月编程语言排行榜:C 语言重回王者?
- tabel表格制作及操作
- 你真的了解分层架构吗?——写给被PetShop毒害的朋友们 (转)
- asp.net 正在加载效果实现
- URLDecoder和URLEncoder的使用总结
- 软件测试中的缺陷分析与管理
- LoRaWAN协议格式
- codeforces1549 F1 - Gregor and the Odd Cows (Easy)(皮克公式)
- python生成首尾相连的字符串
- pt-archiver归档数据 源库和目标库是否会出现不一致
- 算法注册机编写扫盲---第三课
- 怎么将小程序添加到我的小程序?
- android电话录音没有声音,Android通话录音未录制来电语音(示例代码)
- 华为OD机试 - 最小调整顺序次数、特异性双端队列
- 2022年网搭国赛PXE服务
热门文章
- SDNU 1268.超超爱链表
- Java设计模式中组合模式是什么/树形结构怎么组合或显示存储,编程怎么实现树形结构
- 球体动画Android,使用CSS创建一个炫酷的球体动画效果
- 途牛旅游项目练习-登录篇
- 中国民族药产业“十四五”发展重点及投资商机研究报告2021-2027年
- 洛谷 P1617 爱与愁的一千个伤心的理由
- dbg 寻找main函数
- oracle 查询缓存是否开启,数据库强制的开启全库缓存模式
- 王道出版的机试指南_《王道论坛计算机考研机试指南》试读版.pdf
- PL/SQL Developer x64 官网下载、中文包、注册码