Atcoder Regular Contest 058 题解
ARC058C. Iroha's Obsession *1174
#include <bits/stdc++.h>
using namespace std;
int n, k, x;
bool D[11];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
for(int i = 1; i <= k; i ++)
{
cin >> x;
D[x] = true;
}
for(int i = n; i <= 1000000; i ++)
{
int ii = i;
bool Flag = true;
while(ii > 0)
{
if(D[ii % 10]) Flag = false;
ii /= 10;
}
if(Flag)
{
cout << i << '\n';
break;
}
}
return 0;
}
ARC058D. Iroha and a Grid *1905
还算比较经典的组合数学题目。我们注意到
我们先考虑如果没有任何矩形被 ban 掉我们要怎么做。这是简单的,就是
接下来我们考虑它 ban 掉了哪个区域,其实就是
然后就做完了。因为我们需要计算组合数,所以我们可能还需要预处理一步阶乘和阶乘逆元。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN = 200005;
const LL MOD = 1e9 + 7;
LL n, m, A, B, fac[MAXN], inv[MAXN];
LL QuickPow(LL a, LL b, LL p)
{
LL res = 1;
while(b > 0)
{
if(b & 1) res = (res * a) % p;
a = (a * a) % p;
b >>= 1;
}
return res;
}
LL C(LL a, LL b)
{
if(a < b) return 0;
else return ((fac[a] * inv[b]) % MOD * inv[a - b]) % MOD;
}
LL calc(LL a, LL b) { return C(a + b - 2, a - 1); }
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m >> A >> B;
fac[0] = 1;
for(LL i = 1; i <= n + m - 2; i ++) fac[i] = (fac[i - 1] * i) % MOD;
inv[n + m - 2] = QuickPow(fac[n + m - 2], MOD - 2, MOD);
for(LL i = n + m - 3; i >= 0; i --) inv[i] = (inv[i + 1] * (i + 1)) % MOD;
LL ans = 0;
for(LL i = 1; i <= n - A; i ++)
ans = (ans + (calc(i, B) * calc(n - i + 1, m - B)) % MOD) % MOD;
cout << ans << '\n';
return 0;
}
ARC058E. Iroha and Haiku *2473
过于神秘了,一眼丁真为我做不出来的题。
首先我们肯定知道如果正着做肯定是不好做的,一个很直接的原因就是贡献会算重复。然后就寄了。所以我们算有多少个序列是不好的。
然后我们考虑到它的
我们定义
什么情况下这个后缀和串是不好的呢?非常简单,有三种情况:
- 不存在一个后缀和等于
- 不存在一个后缀和等于
- 不存在一个后缀和等于
至于怎么计算后缀和串,这是简单的。我们考虑枚举 ((j << k) | (1 << (k - 1))) & ((1 << (X + Y + Z)) - 1)
。这是容易理解的。然后就是普通的计数,后面是简单的。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD = 1e9 + 7;
LL n, X, Y, Z, tot = 1, DP[45][(1 << 17) + 5];
bool check(LL stat)
{
if(!(stat & (1 << (Z - 1)))) return true;
if(!(stat & (1 << (Y + Z - 1)))) return true;
if(!(stat & (1 << (X + Y + Z - 1)))) return true;
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> X >> Y >> Z;
for(LL i = 1; i <= n; i ++) tot = (tot * 10) % MOD;
DP[0][0] = 1;
for(LL i = 1; i <= n; i ++)
{
for(LL j = 0; j < (1 << (X + Y + Z)); j ++)
{
for(LL k = 1; k <= 10; k ++)
{
LL stat = ((j << k) | (1 << (k - 1))) & ((1 << (X + Y + Z)) - 1);
if(!check(stat)) continue;
DP[i][stat] = (DP[i][stat] + DP[i - 1][j]) % MOD;
}
}
}
for(LL i = 0; i < (1 << (X + Y + Z)); i ++) tot = ((tot - DP[n][i]) % MOD + MOD) % MOD;
cout << tot << '\n';
return 0;
}
F 题是巨大不可做题,我没有能力补。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】