首页
关于作者
Search
1
河南萌新联赛2026第(一)场:河南工业大学A题题解
5 阅读
2
sql注入
3 阅读
3
注意!
3 阅读
4
河南萌新联赛2026第(一)场:河南工业大学B题题解
3 阅读
默认分类
游戏
比赛
网安
学习
登录
Search
llwqs
累计撰写
4
篇文章
累计收到
2
条评论
首页
栏目
默认分类
游戏
比赛
网安
学习
页面
关于作者
搜索到
3
篇与
的结果
2026-07-27
河南萌新联赛2026第(一)场:河南工业大学B题题解
题目核心思路解析 这里是题目链接1. 操作的本质与等差数列的性质题目允许我们对数组中的元素进行任意次“加 $x$”或“减 $x$”的操作。这意味着,最终数组中的每个元素 $a_i$ 都可以变成 $a_i + k \cdot x$($k$ 为任意整数)。换句话说,每个元素在模 $x$ 意义下的余数是不会改变的。假设我们最终将数组变成了一个公差为 $D$ 的等差数列,那么对于任意相邻的两个元素,它们的差值在模 $x$ 意义下必须等于 $D$。即:$a_{i+1} - a_i \equiv D \pmod x$。2. 推导关键约束条件既然所有的相邻差值 $a_{i+1} - a_i$ 在模 $x$ 意义下都等于 $D$,那么任意两个相邻差值在模 $x$ 意义下必须相等。即:$(a_{i+1} - a_i) \equiv (a_{j+1} - a_j) \pmod x$。将其转化为整除关系,即:$x$ 必须能整除任意两个相邻差值的差。即:$x \mid ((a_{i+1} - a_i) - (a_{j+1} - a_j))$。为了让 $x$ 尽可能大,我们需要找到所有“相邻差值的差”的最大公约数(GCD)。完整代码#include<bits/stdc++.h> using namespace std; long long my_gcd(long long a, long long b) { a = abs(a); b = abs(b); while (b != 0) { a %= b; swap(a, b); } return a; } int main() { int n; if (!(cin >> n)) return 0; vector<long long> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } bool is_arithmetic = true; if (n >= 2) { long long diff = a[1] - a[0]; for (int i = 2; i < n; ++i) { if (a[i] - a[i-1] != diff) { is_arithmetic = false; break; } } } if (is_arithmetic) { cout << -1 << endl; return 0; } long long base_diff = a[1] - a[0]; long long gcd_val = 0; for (int i = 2; i < n; ++i) { long long current_diff = a[i] - a[i-1]; long long val = current_diff - base_diff; gcd_val = my_gcd(gcd_val, val); } cout << gcd_val << endl; return 0; }
2026年07月27日
3 阅读
0 评论
1 点赞
2026-07-27
河南萌新联赛2026第(一)场:河南工业大学A题题解
这道题是一道经典的模拟题,考察的是对复杂规则的理解和代码实现能力。 题目地址题目解析这道题要求我们模拟一个在环形棋盘上进行的多玩家大富翁游戏。我们需要根据给定的规则,一步步执行每个玩家的回合,直到游戏结束。 非常非常大的令人恶心的模拟核心规则梳理游戏环境:一个有 m 个格子的环形棋盘,编号 1 到 m。第 m 格的下一格是第 1 格。n 名玩家,初始都在第 1 格,拥有各自的初始金币。回合流程:玩家按编号 1 到 n 的顺序循环行动。停牌状态: 如果玩家处于停牌状态(由监狱格导致),则解除停牌,本回合不移动、不使用骰子。正常移动: 否则,使用下一个骰子点数 d,顺时针移动 d 格。触发效果: 移动后,根据落点格子的类型触发相应效果。格子类型与效果:起点格 (第 1 格): 落在该格获得 200 金币。注意:游戏开始时在第 1 格不触发此效果。地产格:无主: 如果玩家金币足够,必须购买(扣除价格,玩家成为地主)。有主 (且地主不是自己): 需要向地主支付过路费。如果金币不足,支付所有金币并破产。自己所有: 无效果。幸运格: 获得 150 金币。惩罚格: 扣除 100 金币。如果金币不足,扣除所有金币并破产。监狱格: 进入停牌状态(下一回合不行动)。破产规则:当需要支付金币(过路费或惩罚)时,如果当前金币不足以支付,则支付所有剩余金币,金币变为 0,并立即破产。如果金币恰好足够,支付后金币变为 0,但不会破产。玩家破产后:金币为 0,其所有地产变为无主,并永久退出游戏(不再参与后续回合)。游戏结束条件:场上仅剩 1 名玩家未破产。所有骰子都已使用完毕。输出:游戏结束时,按玩家编号顺序输出所有玩家的最终状态(金币数量)。解题思路这是一个纯粹的模拟问题,关键在于准确地将题目规则转化为代码逻辑。数据结构设计:玩家 (Player): 需要一个结构体来存储每个玩家的状态,包括:当前金币、当前位置、是否破产、是否停牌、拥有的地产列表。棋盘 (Board): 需要一个数组或向量来表示棋盘上的每个格子。每个格子需要存储其类型和相关信息(如地产的价格、过路费、地主ID)。骰子 (D): 一个数组或向量,按顺序存储所有骰子点数。模拟主循环:使用一个循环来模拟游戏回合。在循环内部,遍历所有玩家(从 1 到 n)。对于每个玩家,首先检查其是否已破产,如果破产则跳过。然后检查游戏是否应该结束(只剩一个玩家或骰子用完)。如果玩家未破产且游戏未结束,则执行该玩家的回合:处理停牌状态。如果未停牌,则掷骰子、移动、触发落点效果。在处理效果时,需要仔细处理金币的增减和破产判断。完整代码#include<bits/stdc++.h> using namespace std; enum celltype{ start, grounds, lucky, punish, jali, }; struct ground{ long long price; long long toll; int owner_id; ground(long long p, long long t) : price(p), toll(t), owner_id(-1) {} }; struct cell{ celltype type; ground* str; cell() : type(start), str(NULL) {} cell(celltype t) : type(t), str(NULL) {} cell(ground* p) : type(grounds), str(p) {} }; struct Player{ int id; long long coins; int pos; bool is_broke; bool is_ban; vector<int> groundd; Player(int i, long long c) : id(i), coins(c), pos(1), is_broke(false), is_ban(false) {} }; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<Player> players; for(int i = 1; i <= n; i++){ long long ci; cin >> ci; players.emplace_back(i, ci); } vector<cell> board(m + 1); for(int i = 1; i <= m; i++){ int types; cin >> types; if(types == 0){ board[i] = cell(start); } else if(types == 1){ long long p, t; cin >> p >> t; board[i] = cell(new ground(p, t)); } else if(types == 2){ board[i] = cell(lucky); } else if(types == 3){ board[i] = cell(punish); } else if(types == 4){ board[i] = cell(jali); } } int k; cin >> k; vector<long long> d(k); for(int i = 0; i < k; i++){ cin >> d[i]; } int d_i = 0; int player_nobroke = n; while(d_i < k && player_nobroke > 1){ for(int i = 0; i < n; i++){ Player& player = players[i]; if(player.is_broke) continue; if(d_i >= k || player_nobroke <= 1) break; if(player.is_ban){ player.is_ban = false; } else { long long ds = d[d_i++]; long long new_pos = (long long)player.pos + ds; player.pos = (int)((new_pos - 1) % m + 1); cell& current_cell = board[player.pos]; switch(current_cell.type){ case start: player.coins += 200; break; case grounds: { ground* str = current_cell.str; if(str->owner_id == -1){ if(player.coins >= str->price){ player.coins -= str->price; str->owner_id = player.id; player.groundd.push_back(player.pos); } } else if(str->owner_id != player.id){ long long t = str->toll; if(player.coins < t){ players[str->owner_id - 1].coins += player.coins; player.coins = 0; player.is_broke = true; player_nobroke--; for(int str_pos : player.groundd){ board[str_pos].str->owner_id = -1; } player.groundd.clear(); } else { player.coins -= t; players[str->owner_id - 1].coins += t; } } break; } case lucky: player.coins += 150; break; case punish: if(player.coins < 100){ player.coins = 0; player.is_broke = true; player_nobroke--; for(int str_pos : player.groundd){ board[str_pos].str->owner_id = -1; } player.groundd.clear(); } else { player.coins -= 100; } break; case jali: player.is_ban = true; break; } if(d_i >= k || player_nobroke <= 1) break; } } } for (int i = 0; i < n; ++i) { if (players[i].is_broke) { cout << "bankrupt 0"; } else { cout << players[i].coins << " " << players[i].groundd.size(); } if (i < n - 1) cout << "\n"; } cout << endl; for (int i = 1; i <= m; ++i) { if (board[i].type == grounds){ delete board[i].str; } } return 0; }
2026年07月27日
5 阅读
2 评论
1 点赞
2026-07-26
sql注入
SQL 注入(SQL Injection)简介SQL 注入(SQLi)是最危险且最普遍的 Web 应用程序安全漏洞之一。它属于一种代码注入技术,其根本原因在于 Web 应用程序在构建动态 SQL 查询时,对用户提交的输入数据未做充分的检查与过滤。工作原理:当应用程序错误地将用户输入当作代码执行,而不是当作数据来处理时,攻击者就可以在输入字段(如表单、URL 参数等)中插入恶意的 SQL 代码片段。这些恶意片段会与后台原本合法的 SQL 语句拼接,从而改变查询逻辑,欺骗数据库执行非预期的命令。攻击者可以完成的任务:绕过身份验证:例如在登录界面输入特定字符,使密码检查失效,从而无需密码即可获取系统权限。修改或删除数据:攻击者可以插入、更新或删除数据库中的记录,如篡改商品价格或删除审核日志。窃取敏感信息:非法获取客户信息、个人数据、商业机密、源代码以及身份验证凭据等。执行系统命令:在某些配置下,攻击者甚至可以通过数据库功能在底层操作系统上执行命令,导致服务器完全被控制。拒绝服务:构造消耗大量资源的查询,使应用程序对合法用户不可用。防御措施:防止 SQL 注入最有效的方法是使用参数化查询(预编译语句),这能将 SQL 代码与用户输入严格分离。此外,实施严格的输入验证与过滤、遵循最小权限原则(限制数据库账户权限)、使用 Web 应用防火墙(WAF)以及定期进行安全审计,也是构建安全防线的重要手段。SQLI-Labs-Master 开源项目介绍SQLI-Labs-Master 是一个旨在提供全面训练环境的开源项目(由 Ata Hakcil 开发),专为学习和实践 SQL 注入技术而设计。它通过模拟真实的漏洞场景,帮助安全研究人员、开发者和学生深入理解 SQL 注入的原理与防御方法。核心特点:丰富的场景模拟:项目包含了从基础到高级的多种难度级别挑战,覆盖了常规注入、盲注(布尔盲注、时间盲注)、联合查询、堆叠查询、报错注入等多种注入类型。闯关式学习:采用类似闯关的模式,每一个关卡都展示了不同的 SQL 注入漏洞类型和利用方式,具有即时反馈机制,帮助学习者及时纠正错误并理解正确的解决方案。直观易用:具有友好的用户界面,新手容易上手,同时也能满足有经验的渗透测试人员进行深入探索的需求。本站已经部署了sqli-labs的环境,你可以点击这里进入靶场进行练习,希望你有一个愉快的练习时光
2026年07月26日
3 阅读
0 评论
1 点赞