首页 > 其他分享 >Atcoder ARC058B Iroha and a Grid

Atcoder ARC058B Iroha and a Grid

时间:2023-07-23 20:11:14浏览次数:32  
标签:Atcoder val int ll ARC058B Grid binom inv mod

考虑从第 \(b\) 列与第 \(b + 1\) 之间分开这个矩阵,钦定 \((i, b)\) 下一步必须走到 \((i, b + 1)\),可以发现这样是不会漏算或算重的。
于是就可以用乘法原理算出这个 \(i\) 的贡献:\(\binom{(i - 1) + (b - 1)}{i - 1}\times \binom{(n - i) + (m - b - 1)}{n - i}\),左半部分的就是 \((1, 1)\) 走到 \((i, b)\) 的方案数,右半部分就是 \((i, b + 1)\) 走到 \((n, m)\) 的方案数。
再用加法原理统计总答案:\(\sum\limits_{i = 1}^{n - a}\binom{(i - 1) + (b - 1)}{i - 1}\times \binom{(n - i) + (m - b - 1)}{n - i}\)。

时间复杂度 \(O(n + m)\)。

// lhzawa(https://www.cnblogs.com/lhzawa/)
// Problem: D - Iroha and a Grid
// Contest: AtCoder - AtCoder Regular Contest 058
// URL: https://atcoder.jp/contests/arc058/tasks/arc058_b
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5;
ll fac[N + 5], inv[N + 5];
const ll mod = 1e9 + 7;
ll _inv(ll a) {
	ll b = mod - 2, val = 1;
	for (; b; b >>= 1, a = a * a % mod) {
		if (b & 1) {
			val = val * a % mod;
		}
	}
	return val;
}
ll C(int n, int m) {
	return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
int main() {
	fac[0] = inv[0] = 1ll;
	for (int i = 1; i <= N; i++) {
		fac[i] = 1ll * fac[i - 1] * i % mod;
	}
	inv[N] = _inv(fac[N]);
	for (int i = N - 1; i; i--) {
		inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
	}
	int n, m, a, b;
	scanf("%d%d%d%d", &n, &m, &a, &b);
	long long ans = 0;
	for (int i = 1; i <= n - a; i++) {
		ans = (ans + C(i + b - 2, i - 1) * C(m - b - 1 + n - i, n - i) % mod) % mod; 
	}
	printf("%lld\n", ans);
	return 0;
}

标签:Atcoder,val,int,ll,ARC058B,Grid,binom,inv,mod
From: https://www.cnblogs.com/lhzawa/p/17575827.html

相关文章

  • 练习记录-AtCoder Beginner Contest 311-(A-E)
    写的还挺顺的F之后补A-FirstABC找abc三个字母什么时候出现了一次输出即可B-VacationTogether题意:最长的几个人一排里面均有时间#include<bits/stdc++.h>#defineclosestd::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)usingnamespacestd;typedeflon......
  • Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)——D
    https://atcoder.jp/contests/abc311/tasks/abc311_d思路题目说如果当前方向的下一个点能走,那么就一直走,否则才能转向。根据题意模拟即可,这道题的难点在于,碰到已经走过的点到底要不要走。如果当前方向走到底,其中的点之前全部都走过那么就不能再走了。我们用bfs模拟,对于能一直走......
  • YetAnotherGridTask
    [ABC311F]YetAnotherGridTask考虑找规律。我们先将必定要填黑的格子填完。对于以下的矩形....#........#................处理后....#.....##.#..##.##.##.#####一个必要的观察是:对于从右上角到左下角的次对角线,对角线上必定存在一个分界点,使得其左边全为白,......
  • AtCoder Beginner Contest 311 A-E题解
    A-FirstABC题意给一个长度为N的仅由ABC三个字符组成的字符串S,问S中ABC三个字符第一次出现的位置的最大值。题解使用map<char,bool>判重,记录当前不同的字符串的个数cnt,当cnt等于3时,输出此时的下标+1作为答案。Code#include<bits/stdc++.h>usingnamespacestd;usingll......
  • AtCoder Beginner Contest 311
    A-FirstABC(abc311A)题目大意给定一个字符串,问最短的一个前缀,包含ABC这三个字符。解题思路注意到这个前缀的末尾字母一定是这三个字母中的一个,因此答案就是这三个字母出现位置最早的最大值。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=lo......
  • DevExpress中GridControl控件的基本属性设置和使用方法
    (18条消息)DevExpress中GridControl控件的基本属性设置和使用方法_gridcontrol隐藏列_潘达小新的博客-CSDN博客......
  • Atcoder Regular Contest 154 E - Reverse and Inversion
    只要你发现是诈骗题就好办了。不要像我那样傻傻地瞪一个小时然后才发现那俩sigma里的东西相减是有性质的。先考虑计算单个\(f(p)\),一眼的树状数组……吗?考虑最终答案式子里\(i\)的系数:\(\sum\limits_{j<i}[p_j>p_i]-\sum\limits_{j>i}[p_j<p_i]\),因为\(\sum\limits_{j<i}[p......
  • gridlookupedit可编辑输入属性设置
    设置三个属性this.gl_IOPerson.Properties.ImmediatePopup=true;this.gl_IOPerson.Properties.PopupFilterMode=DevExpress.XtraEditors.PopupFilterMode.Contains;this.gl_IOPerson.Properties.TextEditStyle=DevExpress.XtraEditors.Controls.......
  • Atcoder Regular Contest 124 E - Pass to Next
    首先第一步是一个浅显的观察:我们要求的是所有可能的最终序列的贡献之和,如果能改为计算所有操作序列的贡献之和那问题会简单很多,并且我们惊奇地发现,如果一组\(x_i\)全大于\(0\),那么把它们全减去\(1\)以后得到的答案序列不会改变,而对于任意一种可能的最终序列,必然存在一组\(\m......
  • c#、winfrom在一个窗体中鼠标双击datagridview1选中某行,将其选中的行的所有数据在data
    效果展示:代码逻辑:首先在datagridview1中按条件查询数据,然后在datagridview2在查询和datagridview1中一样的Select语句,只不过在datagridview2的查询语句中需添加where条件获取datagridview1在选中行的id,在datagridview2显示就好了代码:单据筛选按钮 privatevoidbutton1_Click......