2025-10-11模拟赛总结
前言
这场比赛前两题的出题人就是我😋终于当上出题人了!
吸取 tyk 上次出题的教训,我决定当一回良心出题人🤔
显然,在 T1 放橙,T2 放蓝是个不错的选择😙 不出意外的没有出意外
好渴鹅、好鱼鱼还有小松鼠巨佬 AK 了 %%%
作为出题人的我当然是没有参赛的🙂 如果这次要写总结,那就只好写一下找题过程、经历和思路好了。
A
听说 T1 要放简单一点,于是乎,我在千万题中选出了它:
呃……不知道去哪了,让我找找(
虽然这道只是橙题,不过我们还是可以发现有不少不多人挂在了 T1😁,果真在意料之中。
这道题有许多细节(好像也不多),比如判断无解,以及是否重复等等。成功让 zrr、wyn、lzh 等幸运儿挂了 \打call
还是讲一下思路吧:
首先考虑无解的情况,我们会发现,若存在
i 使得a_i 不出现在集合s_i 中,则必定无解(不可能试出来)。否则,尝试次数应该为
\prod\limits_{i = 1}^n v_i - k 。吗?我们发现,若d_i 不满足每一位都属于正确范围,则d_i 不合法。所以只需要减去合法的d_i 数量即可。
再来展示一下美丽的代码:
::::success[code]
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
LL n, k, c = 1;
string v, s[20];
int main() {
cin >> n >> k >> v;
for (int i = 0, m; i < n; i++) {
cin >> m >> s[i], c *= m;
s[i].find(v[i]) == string::npos && (cout << -1, exit(0), 1);
}
for (string t; k; k--) {
cin >> t;
bool f = 1;
for (int i = 0; i < n; i++)
s[i].find(t[i]) == string::npos && (f = 0);
c -= f;
}
cout << c;
return 0;
}
::::
因为 long long 即可。
B
我可不像 tyk,这道题可是我出的唯一一道数学题,还是非常水的那种。
由于 tyk 出了过多数学题,看不过去了,只好也找了一道数学题,看着还挺不错,既有矩阵又有费马小定理,还有乘法逆元。而且式子推起来也不是很难,估计学过数学的都可以爆切。
话不多说,还是看一下题解吧:
::::info[solution]
题目分析
可以直接用数学方法做出,也可以用矩阵快速幂通过。这里介绍一种用数学方法的。
首先考虑单独的一行的递推式如何简化:
为了求出
不难求出,这里的
进一步化简,可以求得
接下来考虑
将其带入一式,得到
化简一下就变成了
我们惊喜的发现,只需将
就可以得到一个与一式一模一样的式子:
也就是说
于是乎,只需用一式算出
代码实现与细节处理
我们得到了公式,但还没完呢。
注意到
- 当
n, m 作为指数时,根据费马小定理,应对\varphi(p) 取模(10 ^ 9 + 6 )。 - 当
n, m 作为系数时,模数应为p (10 ^ 9 + 7 )。
其他的带入公式算一下即可。
注意要特判
::::
作为良心出题人,特意造了许多
还是太可惜了,好不容易分出了那么多档数据,结果没有一个人去写部分分😡 太生气了
都在学术讨论!给他们讨论了几下,全都会做了!讨厌!
::::success[code]
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int M = 1e9 + 7, P = M - 1;
LL n, m, p, q, a, b, c, d;
string s, t;
LL C(LL x, LL y) {
LL r = 1;
for (; y; x = x * x % M, y >>= 1) y & 1 && (r = r * x % M);
return r;
}
int main() {
cin >> s >> t >> a >> b >> c >> d;
for (auto v : s)
n = (n * 10 % M + v - '0') % M, p = (p * 10 % P + v - '0') % P;
for (auto v : t)
m = (m * 10 % M + v - '0') % M, q = (q * 10 % P + v - '0') % P;
LL k = C(a, (q - 1 + P) % P);
LL o = (a > 1 ? (k * b % M - b + M) % M * C(a - 1, M - 2) % M : (m - 1 + M) % M * b % M);
LL A = k * c % M, B = (k * d % M + o) % M;
LL v = C(A, (p - 1 + P) % P);
LL h = (A > 1 ? (v * B % M - B + M) % M * C((A - 1 + M) % M, M - 2) % M : (n - 1 + M) % M * B % M);
cout << ((k + o) % M * v % M + h) % M;
return 0;
}
::::
ly 只是压了一点行,就被管家活活打断了双腿(
::::warning[谨慎观看]
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int M = 1e9 + 7, P = M - 1;
LL n, m, p, q, a, b, c, d;
string s, t;
LL C(LL x, LL y) {
LL r = 1;
for (; y; x = x * x % M, y >>= 1) y & 1 && (r = r * x % M);
return r;
}
int main() {
cin >> s >> t >> a >> b >> c >> d;
for (auto v : s) n = (n * 10 % M + v - '0') % M, p = (p * 10 % P + v - '0') % P;
for (auto v : t) m = (m * 10 % M + v - '0') % M, q = (q * 10 % P + v - '0') % P;
cout << ((C(a, (q - 1 + P) % P) + (a > 1 ? (C(a, (q - 1 + P) % P) * b % M - b + M) % M * C(a - 1, M - 2) % M : (m - 1 + M) % M * b % M)) % M * C(C(a, (q - 1 + P) % P) * c % M, (p - 1 + P) % P) % M + (C(a, (q - 1 + P) % P) * c % M > 1 ? (C(C(a, (q - 1 + P) % P) * c % M, (p - 1 + P) % P) * (C(a, (q - 1 + P) % P) * d % M + (a > 1 ? (C(a, (q - 1 + P) % P) * b % M - b + M) % M * C(a - 1, M - 2) % M : (m - 1 + M) % M * b % M)) % M % M - (C(a, (q - 1 + P) % P) * d % M + (a > 1 ? (C(a, (q - 1 + P) % P) * b % M - b + M) % M * C(a - 1, M - 2) % M : (m - 1 + M) % M * b % M)) % M + M) % M * C((C(a, (q - 1 + P) % P) * c % M - 1 + M) % M, M - 2) % M : (n - 1 + M) % M * (C(a, (q - 1 + P) % P) * d % M + (a > 1 ? (C(a, (q - 1 + P) % P) * b % M - b + M) % M * C(a - 1, M - 2) % M : (m - 1 + M) % M * b % M)) % M % M)) % M;
return 0;
}
::::
C and D
神秘人出的,也挺简单的,不过没有做。
后记
我出的题确实还是挺简单的,还好没有人来骂我(tyk 就被骂惨了),是不是默认我是良心出题人了😚