Atcoder ARC 059 题解
D - Iroha and a Grid
题意
给出一个
思路
看了一看,排列组合可以计算方格图的方案数,然后我们可以把这个地图分成两部分。中间被ban掉的地图的右边框就是一列分界线,枚举一下分界线上的点,计算从
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200005;
const int mod = 1000000007;
ll fac[N], inv[N];
ll ksm(ll a, ll b)
{
ll res = 1;
while(b)
{
if(b & 1) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= 1;
}
return res;
}
void init()
{
fac[0] = inv[0] = 1ll;
for(int i = 1; i < N; i ++)
fac[i] = 1ll * fac[i - 1] * i % mod;
inv[N - 1] = ksm(fac[N - 1], mod - 2);
for(int i = N - 2; i >= 1; i --)
inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
}
ll C(ll a, ll b)
{
return fac[a] * inv[b] % mod * inv[a - b] % mod;
}
signed main()
{
init();
ll n, m, a, b;
cin >> n >> m >> a >> b;
ll res = 0;
for(int i = 1; i <= n - a; i ++)
{
ll t1 = C(b + i - 2, b - 1);
ll t2 = C(n + m - b - i - 1, m - b - 1);
res = (res + t1 * t2 % mod) % mod;
}
cout << res << '\n';
}
E - Iroha and Haiku
题意
定义一个合法序列为:在长度为
思路
发现正面去思考会很难去重,所以考虑取补集。因为数字都很小,又是个计数问题,于是考虑
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 42, mod = 1000000007;
ll n, x, y, z;
ll f[N][1 << 17];
int main()
{
cin >> n >> x >> y >> z;
ll res = 1;
for(int i = 1; i <= n; i ++)
res = res * 10 % mod;
ll vaild_st = (1 << (x - 1)) | (1 << (x + y - 1)) | (1 << (x + y + z - 1));
ll st = (1 << (x + y + z)) - 1;
f[0][0] = 1;
for(int i = 1; i <= n; i ++)
{
for(ll j = 0; j <= st; j ++)
{
for(ll k = 1; k <= 10; k ++)
{
ll t = (j << k) | (1 << (k - 1)); //在当前状态后面加上填入的数字
t &= st; //只取最后(x + y + z)位
if((t & vaild_st) != vaild_st)
f[i][t] += f[i - 1][j], f[i][t] %= mod;
}
}
}
for(int i = 0; i <= st; i ++)
res = (res - f[n][i] + mod) % mod;
cout << res << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】