首页 > 其他分享 >题解 [ABC259Ex] Yet Another Path Counting

题解 [ABC259Ex] Yet Another Path Counting

时间:2022-11-06 16:02:29浏览次数:55  
标签:ifac 题解 ll pos ABC259Ex Another rep dp mod

首先,每种颜色互不干扰,因此考虑对每种颜色统计答案。

有两种解法:

  • 枚举起始格子 \((x,y)\) 和结尾格子 \((z,w)\),由组合数易知共有 \(\binom{z-x+w-y}{z-x}\) 种路径。时间复杂度为 \(\mathcal O(k^2)\),其中 \(k\) 为这种颜色格子数量。
  • 动态规划统计这种颜色的格子到每个格子的路径数。时间复杂度为 \(\mathcal O(n^2)\)。

进行根号分治。当 \(k\le n\) 时,第一种解法总复杂度不超过 \(\mathcal O(n^3)\);当 \(k > n\) 时,此类情况不超过 \(n\) 次,第二种解法总复杂度不超过 \(\mathcal O(n^3)\)。

// Problem: AT_abc259_h [ABC259Ex] Yet Another Path Counting
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/AT_abc259_h
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(ll x=(y);x<=(z);x++)
#define per(x,y,z) for(ll x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
const ll N = 405, mod = 998244353;

ll n, a[N][N], dp[N][N], fac[N*2], ifac[N*2], ans;
vector<tuple<ll, ll> > pos[N*N];
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
void initC(ll x) {
	fac[0] = fac[1] = ifac[0] = ifac[1] = 1;
	rep(i, 2, x) {
		fac[i] = fac[i-1] * i % mod;
		ifac[i] = (mod - mod / i) * ifac[mod%i] % mod;
	}
	rep(i, 2, x) ifac[i] = ifac[i-1] * ifac[i] % mod;
}
ll C(ll x, ll y) {
	if(x < 0 || y < 0 || x < y) return 0;
	return fac[x] * ifac[y] % mod * ifac[x-y] % mod;
}

int main() {
	initC(N*2-1);
	scanf("%lld", &n);
	rep(i, 1, n) {
		rep(j, 1, n) {
			scanf("%lld", &a[i][j]);
			pos[a[i][j]].emplace_back(i, j);
		}
	}
	rep(c, 1, n*n) {
		if(!pos[c].empty()) {
			if((ll)pos[c].size() <= n) {
				ll sz = pos[c].size();
				rep(i, 0, sz-1) {
					rep(j, 0, sz-1) {
						ll x = get<0>(pos[c][j]) + get<1>(pos[c][j]) - get<0>(pos[c][i]) - get<1>(pos[c][i]);
						ll y = get<0>(pos[c][j]) - get<0>(pos[c][i]);
						ans += C(x, y);
						ans %= mod;
					}
				}
			}
			else {
				rep(i, 1, n) {
					rep(j, 1, n) {
						dp[i][j] = (a[i][j] == c);
						dp[i][j] += dp[i-1][j]; dp[i][j] %= mod;
						dp[i][j] += dp[i][j-1]; dp[i][j] %= mod;
						if(a[i][j] == c) {
							ans += dp[i][j];
							ans %= mod;
						}
					}
				}
			}
		}
	}
	printf("%lld\n", ans);
	return 0;
}

标签:ifac,题解,ll,pos,ABC259Ex,Another,rep,dp,mod
From: https://www.cnblogs.com/ruierqwq/p/abc259h.html

相关文章

  • Codeforces-1753B Factorial Divisibility题解
    Codeforces-1753BFactorialDivisibility参考:https://blog.csdn.net/qq_38236082/article/details/127500190题意:问$a_1!+a_2!+a_3!+...+a_n!$能否被$x!$整除。......
  • 题解 [AGC044C] Strange Dance
    这道题启示我们Trie树是可以支持全局下标加\(1\)的。首先把\(3^n\)个人从低位到高位建到三进制Trie树上。类似二叉树的左右儿子,我们称由\(0,1,2\)边连接的儿子......
  • KMP 自动机,孤独的自动机(同时也是CF1721E的题解)
    给定字符串\(s\),以及\(q\)个串\(t_i\),求将\(s\)分别与每个\(t_i\)拼接起来后,最靠右的\(|t_i|\)个前缀的border长度。询问间相互独立。\(|s|\leq10^6,q......
  • 【题解】洛谷P2725 [USACO3.1]邮票 Stamps
    从n种邮票中选出不超过k张邮票,使选出来的邮票可以表示1~m之间(含)的所有数。每张邮票在不超过k的前提下,都可以使用无数次,因此可以将问题看成一个完全背包问题。n种邮票就是n......
  • [ARC069F]Flags 题解
    因为一个小错误整整调了一天qwq除去2-SAT部分没学过去学了一下,其它部分都想出来了,四舍五入我自己写了一道Cu,好欸(虽然这Cu好像非常水QAQ)。F-Flags一条数轴上有......
  • P8813(CSP-J2022T1)题解
    题意:算a ^ b,如果结果超出1e9就输出-1,反之输出结果。思路:边算边判加特判。代码:#include<cstdio>#definelllonglong#definemx1e9//边界usingnamespacestd;i......
  • P8814(CSP-J2022T2)题解
    题意:给定一个正整数 k,有k 次询问,每次给定三个正整数 n, e, d,求两个正整数 p, q,使 n = p × q且e × d =(p −1)×(q −1)+1。思路:通过题意可以发......
  • AtCoder Beginner Contest 276 A~G 题解
    今天凌晨CFD题差一句判断AC,晚上ABCG题把插板法和快速幂搞混差点AC。事不过三,再这样一次我直接紫砂。太简单的题就不放翻译和代码了。(事实上这场A-E都是大水题......
  • 个人比赛实况和题解
    CodeforcesCF1740:实况:https://pan.baidu.com/s/1BYjUp2Atvqkpqe3jVogPTQ(提取码:1104);题解:https://www.cnblogs.com/lucius7/p/16861747.html。AtCoderabc275:实况:https://p......
  • 洛谷P8757 [蓝桥杯 2021 省 A2] 完美序列 题解
    思路为使描述方便,先令题目描述中的“完美序列”反转(即序列单调递增且每一个数都是上一个数的倍数)。原“完美序列”与反转后的本质相同。先考虑最大长度。显然,当完美序列......