第十五届吉林省赛个人题解【中档题(不过可能对你来说是简单题)】(H、G、C)

文章目录

  • H. Visit the Park(STL)
  • G. Matrix Repair(思维题)
  • C.Random Number Generator(BSGS算法)

H. Visit the Park(STL)

题意:给你一个无向图,每条边上都有一个数码,然后给你一个路径,每次你必须从Ai走到Ai+1(直接走到,必须相邻),如果有多条路径,你等概率的选择这些路径,这样从头走到尾,你依次把这些数码写下来,得到一个十进制数,现在问你最后可以得到的期望是多少?
思路:我们可以单独考虑每一位的贡献,个位上的某种在所有从左到右写下来的数的个位的占比仅和个位自身各种数码的比例有关,尽管高其他位右各种选择,但是个位上出现这个数码的概率是相同的。利用map我们维护总数,和各种数码出现的次数。
注意:这里容易被卡常,我们可以发现求逆元的常数为30,加上10个数码,如果放到循环內部的话,就是300,再乘上3e5,9e7加上其他常数,tle4了。所以必须放外面。logn最多是20,常数小1.5倍。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 3e5 + 5, mod = 998244853;
map<pair<int, int>, int> g[N];//这是一个map<pair<int,int>, int>为元素的数组
map<pair<int, int>, int> sum;
ll po(ll rad, ll idx) {
	ll res = 1;
	while (idx) {
		if (idx & 1) res = res * rad % mod;
		rad = rad * rad % mod;
		idx >>= 1;
	}
	return res;
}
int a[N];
void solve() {
	int n, m, k;
	cin >> n >> m >> k;
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u][{v, w}]++;
		g[v][{u, w}]++;
		sum[{u, v}]++;
		sum[{v, u}]++;
	}
	for (int i = 1; i <= k; i++) cin >> a[i];
	ll ans = 0;
	for (int i = k; i > 1; i--) {
		int u = a[i], v = a[i - 1];
		int ss = sum[{u, v}];
		if (!ss) {
			cout << "Stupid Msacywy!\n";
			return;
		}
		ll mul = po(10, k - i), sub = po(ss, mod - 2);//这里很重要 
		for (int j = 1; j <= 9; j++) {
			if (g[u].count({v, j})) ans = (ans + mul * j % mod * g[u][{v, j}] % mod * sub % mod) % mod; 
		}
	}
	cout << ans << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
//	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

G. Matrix Repair(思维题)

背景:在数据传输当中常见的奇偶性检查
题意:给你一个破损的矩阵,给你原来的矩阵的行列的奇偶性,让你复原这个矩阵,如果矩阵唯一,就输出这个矩阵,如果矩阵不唯一,就输出-1。
思路:(借用oiwiki的图)
在这里插入图片描述
我们如果把所有-1处和所在的行列列出方程,我们可以发现,如果说任何一行一列都不存在只有一个-1的情况,那么每条方程,至少有两个未知数。对于不同行,不同列,这些方程最多只有一个相同的未知元。(也就是某行和某列相交的情况有一个相同的未知元(-1)),因此我们无法通过加减消元解出任何一个确定的未知元,无论如何消元都至少有两个未知元。因此我们拓扑排序,逐步带入某个确定的未知元即可。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
const int N = 1005, mod = 998244853;
int a[N][N], r[N], c[N], nr[N], nc[N];
set<int> g[N << 1];
void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> a[i][j];
		}
	}
	for (int i = 1; i <= n; i++) {
		cin >> nr[i];
		int s = 0;
		for (int j = 1; j <= n; j++) {
			if (a[i][j] == -1) {
				g[i].insert(j);
				continue;
			}
			s ^= a[i][j];
		}
		r[i] = s;
	}
	for (int j = 1; j <= n; j++) {
		cin >> nc[j];
		int s = 0;
		for (int i = 1; i <= n; i++) {
			if (a[i][j] == -1) {
				g[j + n].insert(i);
				continue;
			}
			s ^= a[i][j];
		}
		c[j] = s;
	}
	set<pair<int, int>> st;
	for (int i = 1; i <= n * 2; i++) {
		st.insert({g[i].size(), i});
	}
	while (!st.empty()) {
		pair<int, int> pii = *st.begin();
		int fi = pii.first, se = pii.second;
		st.erase(st.begin());
		if (fi == 0) continue;
		if (fi != 1) break;
		if (se > n) {//如果是某列的话 
			int x = *g[se].begin();//该列含有的唯一的-1 
			g[se].erase(g[se].begin());//删除-1 
			st.erase({g[x].size(), x});//-1所在行删除 
			int y = se - n;//对应列 
			g[x].erase(y);//对应行删除本列
			st.insert({g[x].size(), x});//更新对应行 
			a[x][y] = c[y] ^ nc[y];//填数字 
			c[y] = nc[y];//更新列 
			r[x] ^= a[x][y];//更新行 
		} else {
			int y = *g[se].begin();//该行含有的唯一的-1 
			g[se].erase(g[se].begin());//删除-1 
			int x = se;//对应行 
			st.erase({g[y + n].size(), y + n});//删除对应列,这里要+n 
			g[y + n].erase(x);
			st.insert({g[y + n].size(), y + n});//更新对应列 
			a[x][y] = r[x] ^ nr[x];//更新 
			r[x] = nr[x];
			c[y] ^= a[x][y];
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (a[i][j] == -1) {
				cout << -1 << '\n';
				return;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cout << a[i][j] << " \n"[j == n];
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
//	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

C.Random Number Generator(BSGS算法)

题意:给定x0,a,b,m,问利用线性同余方法xi+1=axi+b(mod m)判断某个数是否在xn的集合内。
思路:参考这篇
补充一下如何求出等比式子,待定系数法。
A X n + 1 + B = a ( A X n + B ) AX_{n+1}+B=a(AX_n+B) AXn+1+B=a(AXn+B)
A X n + 1 = a A X n + a B − B = A a X n + A b AX_{n+1}=aAX_n+aB-B=AaX_{n}+Ab AXn+1=aAXn+aBB=AaXn+Ab
A = 1 , B = b a − 1 A=1,B=\frac{b}{a-1} A=1,B=a1b
评论:BSGS就是暴力根号分治加哈希。
关于特判:a= 1的时候b=0的时候是no,注意不要使用 a- 1作为逆元,0逆元会把人橄榄。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-9
using namespace std;
ll a, b, x0, m, x;
ll po(ll rad, ll idx) {
	ll res = 1;
	while (idx) {
		if (idx & 1) res = res * rad % m;
		rad = rad * rad % m;
		idx >>= 1;
	}
	return res;
}
ll bsgs(ll a, ll b) {
	map<ll, ll> mp;
	ll cur = 1, t = sqrtl(m) + 1;
	for (int B = 1; B <= t; B++) {
		cur = cur * a % m;
		mp[cur * b % m] = B;
	}
	ll now = cur;
	for (int A = 1; A <= t; A++) {
		if (mp.count(now)) return A * t - mp[now];
		now = now * cur % m;
	}
	return -1;
}
void solve() {
	cin >> a >> b >> m >> x0 >> x;
	if (x == x0) {
		cout << "YES\n";
		return;
	}
	if (a == 0) {
		cout << (x == b % m ? "YES\n" : "NO\n");
		return;
	}
	if (a == 1) {
		if (b == 0) {
			cout << "NO\n";
			return;
		} 
	}
	ll aa = a;
	ll bb = (x * (a - 1) + b % m) % m * po((x0 * (a - 1) + b) % m, m - 2) % m;
	cout << (bsgs(aa, bb) == -1 ? "NO\n" : "YES\n");
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
//	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

能否实现有价值观的--AI ?

人机融合所形成的新系统确实有可能产生新的科技革命。人机融合可以将人类的智慧和创造力与机器的计算能力和数据处理能力相结合&#xff0c;从而创造出更加智能化和高效化的新系统和产品。例如&#xff0c;人机融合可以推动智能制造、智能医疗、智能交通、智慧城市等各个领域的…

Go:值与指针

1. 计算机中的值 在百万年的演化历史中&#xff0c;人类对事物的属性进行了抽象&#xff0c;有了数量、精度、信息等概念的表示&#xff0c;对应的我们称之为整数、小数、文本文字等。计算机出现后&#xff0c;我们使用计算机对真实世界的问题进行建模&#xff0c;通过计算机的…

俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)

开发出一款能够与 AI 对话生成和编辑思维导图的工具&#xff0c;听起来似乎只能是一群专业的 AI 背景团队花费大量的时间和精力训练模型&#xff0c;打磨应用才能完成的事情。 但是&#xff0c;两名大学生却在一夜之间完成了&#xff0c;就像炼金术士将庸俗的材料转化成黄金一…

【c语言】字符串比较 | API仿真

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

Snipaste介绍、安装、使用技巧(截图贴图工具)

一、简介 Snipaste 是一个简单但强大的截图贴图工具&#xff0c;也可以让你将截图贴回到屏幕上&#xff01;下载并打开 Snipaste&#xff0c;按下 F1 来开始截图&#xff0c;再按 F3&#xff0c;截图就在桌面置顶显示了。就这么简单&#xff01; 你还可以将剪贴板里的文字…

学习分享|一文搞懂WiFi 6/7 以及选择路由器改造网络那些事

目录 什么是 WiFi 6 WiFi 6 功能特点 WIFI 6 与前几代对比 速度更快 延时更低 容量更大 更安全 更省电 WiFi 4~WiFi 6对比 WiFi 6 核心技术 WiFi 7 WiFi 世代列表 路由器常用技术扩展 2.5Ge 网口 WAN/LAN口复用/网口盲插 双WAN口 双LAN口端口聚合 mesh组网 聊…

思维导图手撕MyBatis源码

文章目录 前置准备通过类加载器读取配置文件流创建sqlSessionFactory建造者模式的使用 打开SqlSession获取Mapper接口对象执行Mapper接口方法 前置准备 既然要读MyBatis的源码&#xff0c;那么我们就要先弄清楚MyBatis的入口在哪。这里我们直接写一个标准的MyBatis使用程序&am…

6.1.1 图:基本概念

一&#xff0c;基本概念 1.基本定义 &#xff08;1&#xff09;图的定义 顶点集不可以是空集&#xff0c;但边集可以是空集。 &#xff08;2&#xff09; 有向图的表示&#xff1a; 圆括号 无向图的表示&#xff1a; 尖括号 简单图、多重图&#xff1a; 简单图&#xff1a;…

基于 SpringBoot+WebSocket 无DB实现在线聊天室

0 项目说明 0.1 样例展示 0.2 源码地址 GitHub&#xff1a;https://github.com/ShiJieCloud/web-chat Gitee&#xff1a;https://gitee.com/suitbaby/web-chat GitCode&#xff1a;I’m Jie / web-chat GitCode 1 WebSocket 简介 1.1 HTTP 常用的 HTTP 协议是一种无状态…

刚进公司就负责项目,把老弟整蒙了!

刚进公司就负责项目&#xff0c;把老弟整蒙了&#xff01; 大家好&#xff0c;我是鱼皮&#xff0c;先把封面图送给大家&#xff1a; 又快到周末了&#xff0c;今天分享一些轻松的编程经验~ 还记得我学编程的老弟小阿巴么&#xff1f;他目前大二&#xff0c;听说最近刚刚找到…

Redis超详细入门手册教程!还不快来看看?

地址&#xff1a; RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures …https://redis.io/ 1&#xff1a;NoSQL简介 1.1&#xff1a;数据库应用的演变历程 单…

线程的原子性、可见性、有序性及线程安全知识整理

要想保证线程安全&#xff0c;必须同时满足原子性、可见性、有序性。 一、定义 1.1 原子性 一个操作或者多个操作&#xff0c;要么全部执行&#xff0c;并且执行的过程不会被打断&#xff0c; 要么就全部不执行&#xff08;一个操作是不可被分割的&#xff09;。 Java中实现…

ApiPost简单使用

目录 环境与变量 设置与使用 随机参数变量 内置Mock字段随机参数 自定义随机参数 全局参数 使用手册 apipost可支持一键压测和自动化接口测试 环境与变量 设置与使用 设置 环境变量可设置环境名称、变量名称、变量初始值、URL&#xff1a; 可以在请求变量或者接口 URL…

攻防世界-web-simple js

题目描述&#xff1a;小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 打开链接&#xff1a; 然后我们会发现不管我们输入什么密码&#xff0c;发现是都是这样的报错 1. 先用bp抓包看看&#xff0c;可以抓到这样的一串js脚本 看不懂…

matlab实现BP神经网络(完整DEMO)

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络Demo代码 1.1 代码整体思路 1.2 BP神经网络Demo代码 二、运行结果 2.1 拟合曲线 2.2训练误差与预测误差 三、相关文章 3.1-BP的入门学习目录&#xff1a;老饼…

JavaScript经典教程(七)-- JavaScript初级

190&#xff1a;JavaScript初级内容 - DOM查询、插入内容、赋予样式等 1、DOM操作 DOM&#xff1a;节点&#xff0c;也就是html中的元素&#xff1b; DOM操作&#xff1a;其实就是节点元素的方法&#xff1b; &#xff08;1&#xff09;innerHTML - 返回元素内容 同时也可以…

关于maven

一、maven是什么 一个java项目构建工具 二、maven的作用 &#xff08;1&#xff09;依赖管理 不同框架整合&#xff0c;互相依赖jar包版本不同&#xff0c;版本不一样&#xff0c;程序跑起来就会报错。用maven管理jar包。 &#xff08;2&#xff09;跨平台构建项目 linux服…

数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)

目录 最大堆的建立 方法1 方法2 思路图解 代码实现 代码解释 PercDown BuildHeap 最大堆的建立 建立最大堆&#xff1a;将已经存在的N个元素按最大堆的要求存放在一个一维数组中。 方法1 通过插入操作&#xff0c;将N个元素一个一个地插入到一个初始为空的堆中去。…

简述对象检测与图像分类与关键点检测区别

计算机视觉是人工智能的一个多元化领域&#xff0c;旨在检测和识别图像或视频的内容。大多数开始计算机视觉领域之旅的人的常见问题之一是&#xff1a;目标检测、图像分类和关键点检测之间有什么区别&#xff1f; 让我们先看看 什么是对象检测 对象检测是一种计算机视觉和图像…

excel中英文互译

在excel运行宏时弹出下面的提示&#xff1a; 无法运行“XXXXX”宏。可能是因为该宏在此工作薄中不可用&#xff0c;或者所有的宏都被禁用的错误提示 解决办法&#xff1a; 1、点击“文件”选项卡&#xff1b; 2、在选项卡界面窗口中选择“选项”按钮&#xff1b; 3、在“选项…