mobile wallpaper 1
1105 字
3 分钟
牛客周赛 Round 127
2026-01-19

☁️体验#

除最后一题之外,感觉都挺简单。

💡题解#

A - Get The Number#

题意#

给你 33 个正整数 aabbcc

让你判断 aabb 能否通过加减乘除其中一种操作,得到 cc

其中,除法需要满足 aa 能被 bb 整除。

思路#

直接模拟即可。

其中,aa 能被 bb 整除,换句话来说,就是 aa 等于 b×cb \times c

代码#

void solve()
{
int a, b, c;
cin >> a >> b >> c;
if(a + b == c || a - b == c || a * b == c || a == b * c) YES;
else NO;
}

B - Sudoku#

题意#

检验 4×44 \times 4 版本的数独是否合法。

思路#

有点麻烦的模拟,分类讨论即可。

代码#

void solve()
{
vector<vector<int>> a(4, vector<int> (4));
vvcin(a);
vector<set<int>> c(4), r(4);
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
c[i].insert(a[i][j]);
r[j].insert(a[j][i]);
}
for(auto& i : c)
if(i.size() != 4)
{
NO;
return;
}
for(auto& i : r)
if(i.size() != 4)
{
NO;
return;
}
vector<pair<int, int>> b = {{0, 0}, {0, 2}, {2, 0}, {2, 2}};
for(auto& [x, y] : b)
{
set<int> s;
for(int i = x; i < x + 2; i++)
for(int j = y; j < y + 2; j++)
s.insert(a[i][j]);
if(s.size() != 4)
{
NO;
return;
}
}
YES;
}

C - Carry The Bit#

题意#

给你一个正整数 nn,你需要对 nn 进行以下操作恰好一次:

  • 选择 nn 的任意一个数位,将该数位进行四舍五入。

四舍五入:

  • 具体来说,设你选择的是从右往左第 k 位(k1k \ge 1,个位是第 1111 位),如果该位数字 5\ge 5,则将该位及其右侧所有数位都变为 00,并将前一位加 11(必要时继续向更高位进位);若不存在前一位(即选择的是最高位),则在数的最左端新增一个 11;如果该位数字 4\le 4,则直接将该位及其右侧所有数位都变为 00

你的任务就是求出进行恰好一次操作后,能得到的最大的结果是多少。

其中:10n<1020000010 \leq n < 10^{200000}

思路#

由于 nn 很大,我们使用字符串进行高精度模拟。

从前往后遍历,找到第一个大于等于 55 的数位,将其进行四舍五入。

如果没有找到,说明所有的数位都小于 55,我们直接将最后一位进行四舍五入,使减少量最小。

代码#

void solve()
{
string s;
cin >> s;
int n = s.length();
bool ok = false;
for(int i = 0; i < n; i++)
if(s[i] >= '5')
{
ok = true;
for(int k = i; k < n; k++)
s[k] = '0';
int j = i - 1;
while(j >= 0 && s[j] == '9')
{
s[j] = '0';
j--;
}
if(j >= 0) s[j]++;
else s = "1" + s;
break;
}
if(!ok) s[n - 1] = '0';
D(s);
}

D - Permutation² Counting#

题意#

给定一个长度为 nn 的正整数序列 aa,问 aa 中有多少个子序列是双排列,将答案对 998244353998244353 取模。

双排列:

  • 长度为 2n2n 的双排列为两个长度为 nn 的排列打乱顺序后得到的数组。

思路#

很明显,我们无需考虑子序列的顺序,只需要考虑子序列中元素的数量就好。

先统计每个元素的出现次数。

然后,从 11 开始:

  • fif_iii 的出现次数,nn 为满足条件的最后一个数。
  • 如果 fi1f_i \le 1,那么到 ii 这个数这里,就不再满足双排列的条件,后续的数也必然不再满足,计数结束。
  • 如果 fi2f_i \ge 2,那么对于 ii 这个数,在 fif_i 中选择 22 个元素,就有 Cfi2C_{f_i}^2 种选择方法。
  • 因此,对于从 11nn 的双排列,就有 i=1nCfi2\prod_{i = 1}^{n} C_{f_i}^2 种选择方法。
  • 最后,我们的答案就是 i=1ni=1nCfi2\sum_{i = 1}^{n} \prod_{i = 1}^{n} C_{f_i}^2

代码#

void solve()
{
input(n, a);
unordered_map<int, int> f;
for(int& i : a)
f[i]++;
int ans = 0, add = 1;
for(int i = 1; f[i] >= 2; i++)
{
int x = f[i] * (f[i] - 1) / 2 % mod;
add = add * x % mod;
ans = (ans % mod + add % mod) % mod;
}
D(ans % mod);
}

E - Balanced 01-String#

题意#

给你一个 0101 字符串 ss

但是其中有些位是 '??',你可以任意填入 '00' 或 '11'。

如果相邻相同的对数是偶数,那么这个字符串就是平衡的。

问有多少种不同的填入方法,使得该字符串平衡,并将答案对 998244353998244353 取模。

思路#

平衡的01串,其相同对数的个数是偶数。

设长度为 nn,可以得出:

相同对数+不同对数=n1相同对数 + 不同对数 = n - 1

我们可以从不同对数的角度来突破这个问题。

那么,平衡的01串,满足其中一个条件即可:

  • 不同对数的个数是偶数,并且 n1n - 1 是偶数;
  • 不同对数的个数是奇数,并且 n1n - 1 是奇数。

现在设相邻不同对数为 xx

那一对相邻对,能对 xx 产生的贡献是多少?

  • 如果 sisi+1s_i \neq s_{i+1}xx 就会加 11
  • 如果 si=si+1s_i = s_{i+1},就没有贡献。

不难发现,这简直和异或一模一样。

那么,按照题目给出的定义,我们可以得出:

x=i=1n1sisi+1x = \sum_{i=1}^{n-1} s_i \oplus s_{i+1}

xmod2=i=1n1sisi+1=s1snx \mod 2 = \oplus_{i=1}^{n-1} s_i \oplus s_{i+1} = s_1 \oplus s_n

显然,中间的 '??' 可以随便填。

根据上面的分析,我们可以得出:

两端的异或值需要与 nn 的奇偶性相同。

设 '??' 的个数为 qq

  • 如果两端都不是 '??',并且已经满足奇偶关系,那答案就是 2q2^q
  • 如果两端都不是 '??',但是不满足奇偶关系,那答案就是 00
  • 否则,答案为 2q12^{q-1}

代码#

vector<int> p(500001);
void solve()
{
string s;
cin >> s;
int n = s.length(), ans = 0;
if(n == 1)
{
cout << (s[0] == '?' ? 2 : 1) << endl;
return;
}
int q = 0;
for(char& c : s)
q += c == '?';
char l = s[0], r = s[n - 1];
if(l != '?' && r != '?')
{
int a = l - '0', b = r - '0';
if(a ^ b == (n - 1) % 2)
ans = p[q];
}
D(ans % mod);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
p[0] = 1;
for(int i = 1; i <= 500000; i++)
p[i] = p[i - 1] * 2 % mod;
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}

F - Cherry Tree#

待更新

🎈模板#

头文件#

#include <bits/stdc++.h>
#define inf INT_MAX
#define INF LLONG_MAX
#define MOD 1000000007
#define mod 998244353
#define all(_x) _x.begin(), _x.end()
#define vcin(_x) for(auto& _i : _x) cin >> _i
#define vvcin(_x) for(auto& _j : _x) for(auto& _i : _j) cin >> _i
#define D(_x) cout << _x << endl
#define vD(_x) for(int _i = 0; _i < _x.size(); ++_i) cout << _x[_i] << " \n"[_i == _x.size() - 1]
#define input(_n, _a) int _n; cin >> _n; vector<int> _a(_n); vcin(_a)
#define flr(_i, _l, _r) for(int _i = _l; _i <= _r; ++_i)
#define frl(_i, _r, _l) for(int _i = _r; _i >= _l; --_i)
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define Yes cout << "Yes" << endl
#define No cout << "No" << endl
#define yes cout << "yes" << endl
#define no cout << "no" << endl
using namespace std;
#define int long long
#define endl '\n'
void solve()
{
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int _ = 1;
cin >> _;
while (_--)
solve();
return 0;
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

牛客周赛 Round 127
https://blog.hycode.qzz.io/posts/nk-weekly-127/post/
作者
Hycode
发布于
2026-01-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录