【CLYZ集训】随机游走【状压】【记忆化搜索】

news/2024/7/3 2:30:55

在这里插入图片描述

思路:

考虑状压,但是状态数太多。
可是有一些状态是不可用的。比如说xxxx11xxxx11xxx这个状态如果是走到中间那个x,那么这个i就走不出来了。所以对于这种有连续两个1的情况,把它中间的全部x变成1,这样是等价的。
所以可用状态一定形如xxxxxxxxxxx1111111111这样,其中连续的x中没有两个1是连续的而且前后缀一定是01交错的。(因为不能跳到旁边的地方,所以只能跳2个)
于是分析状态数,首先枚举连续x长度,然后枚举两端01串长度,然后枚举走到的位置。所以是n^4的。

c o d e code code

#include<iostream>
#include<cstdio>
#include<map>

using namespace std;

int n, p, inv;
map<pair<int, __int128>, int> f;
map<pair<int, __int128>, bool> v;
__int128 one = 1;

int qpow(int x, int k) {
	int ans = 1;
	for(; k; k >>= 1, x = 1ll * x * x % p) if(k & 1) ans = 1ll * ans * x % p;
	return ans;
}

__int128 solve(int x, __int128 s) {
	int a = -1, b = -1;
	for(int i = x + 1, j = x + 2; i < x + n - 1; i ++, j ++) {
		int w1, w2;
		if(i >= n) w1 = i - n;
		else w1 = i;
		if(j >= n) w2 = j - n;
		else w2 = j;
		if(((s >> w1) & 1) && ((s >> w2) & 1)) {
			if(a < 0) a = i;
			b = i;
		}
	}
	for(int i = a; i <= b; i ++) {
		int w;
		if(i >= n) w = i - n;
		else w = i;
		s |= (one << w);
	}
	return s;
}

int dfs(int x, __int128 s) {
	if(x >= n) x -= n;
	if(x < 0) x += n;
	if((s >> x) & 1) return 0;
	s |= (one << x);
	s = solve(x, s);
	if(!v[make_pair(x, s)]) f[make_pair(x, s)] = ((0ll + dfs(x + 1, s) + dfs(x + 2, s) + dfs(x - 1, s) + dfs(x - 2, s)) % p * inv % p + 1ll) % p;
	v[make_pair(x, s)] = 1;
	return f[make_pair(x, s)];
}

int main() {
//	freopen("walk.in", "r", stdin);
//	freopen("walk.out", "w", stdout);
	scanf("%d%d", &n, &p);
	inv = qpow(4, p - 2);
	if(n == 1) printf("1");
	else printf("%d", dfs(0, 0));
	return 0;
}

http://lihuaxi.xjx100.cn/news/821457.html

相关文章

Springboot | bean的加载方式

ps&#xff1a;本文为作者学习笔记技术参考意义不大 文章目录一. 自动配置工作流程1. 准备工作二. Bean的加载方式1. 方式一&#xff1a;xml方式定义方式获取方式2. 方式二&#xff1a;注解方式结合配置文件定义方式获取方式3. 方式三&#xff1a;注解结合配置类定义方式获取方…

AcWing 1087. 修剪草坪(背包模型 + 单调队列优化)

AcWing 1087. 修剪草坪&#xff08;背包模型 单调队列优化DP&#xff09;一、问题二、分析1、思路2、状态表示3、状态转移4、单调队列优化三、代码一、问题 二、分析 1、思路 这道题其实类似于背包问题&#xff0c;有两处不同点&#xff0c;一个是本题没有体积的限制&#x…

华为机试题:HJ40 统计字符(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input()与list(input())的区别、及其相互转换方法2、print() &#xff1a;打印输出。3、str.isdigit()&#xff0c;str.isnumeric()&am…

如何批量删除word中的中文和标点符号(word删除中文所有标点符号)

如何批量删除word中的中文和标点符号&#xff08;word删除中文所有标点符号&#xff09; 当文档中前面一列英文&#xff0c;后面一列汉字的时候&#xff0c;你还在一个一个的去删除汉字吗&#xff1f;那样也太慢了。快快看看下面介绍的几种方法&#xff0c;绝对会大大提高你的…

requests库登录网站,Session()和session()差一个大小写非常要命

笔者最近用Python爬取网站&#xff0c;首页需要输入用户名和密码&#xff0c;由于该网站不需要验证码&#xff0c;登录步骤比较简单。用selenium的webdriver打开Chrome浏览器实现自动化来登录&#xff0c;代码不难写而且登录很顺利。后来再想&#xff0c;selenium打开浏览器比较…

JS数据类型有哪些?区别是什么?

JS数据类型有哪些&#xff1f;首先JS数据类型有Number、String、Boolean、BigInt、Symbol、Null、Undefined、Object、8种。其次JS数据类型又分为两类&#xff1a;一类是基本数据类型也叫做简单数据类型。包含7种类型&#xff1a;Number 、String、Boolean、BigInt、Symbol、Nu…

React:有关a标签控制台警告的一些问题

近几日在写react项目的时候&#xff0c;发现了一些问题&#xff0c;特此记录&#xff01; 目录 1.控制台警告信息&#xff0c;由target"_blank"引起的问题 2.由href""引起的问题 1.控制台警告信息&#xff0c;由target"_blank"引起的问题 Usi…

一篇掌握分布式锁

分布式锁理解 1.业务场景引入 在进行代码实现之前&#xff0c;我们先来看一个业务场景&#xff1a; 系统A是一个电商系统&#xff0c;目前是一台机器部署&#xff0c;系统中有一个用户下订单的接口&#xff0c;但是用户下订单之前一定要去检查一下库存&#xff0c;确保库存足…