当前位置:网站首页>Path count 2 (DP + number of combinations)

Path count 2 (DP + number of combinations)

2022-06-11 03:29:00 to cling

daimayuan A daily topic div1 202

Solution

  1. dp[i] Go to the first place i Number of legal solutions for obstacles
  2. Come to the point (x, y) The number of all the schemes : C ( x + y − 2 , x − 1 ) C(x + y - 2, x - 1) C(x+y2,x1)
  3. d p [ i ] = C ( i . x + i . y − 2 , i . x − 1 ) − ∑ d p [ j ] ∗ C ( i . x − j . x + i . y − j . y , i . x − j . x ) dp[i] = C(i.x + i.y - 2, i.x - 1) - \sum dp[j] * C(i.x - j.x + i.y - j.y, i.x - j.x) dp[i]=C(i.x+i.y2,i.x1)dp[j]C(i.xj.x+i.yj.y,i.xj.x)
    namely : Number of legal schemes = Number of all schemes - Number of all illegal schemes

Code

const ll mod = 1000000007;
using namespace std;
const int N = 2e6 + 5;

ll f[N];
ll inv[N], fac[N];
void init()
{
    
	fac[0] = inv[1] = inv[0] = 1;
	// Be careful :inv[0] = 1,  That is, the inverse of the factorial of zero is 1
	for (int i = 1; i <= 2e6; i++)
		fac[i] = fac[i - 1] * i % mod;
	
	// Find out first 1~n Inverse element 
	for (int i = 2; i <= 2e6; i++)
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
	//1~n The inverse element accumulation of is  1~n The inverse element of the factorial of 
	for (int i = 2; i <= 2e6; i++)
		inv[i] = inv[i] * inv[i - 1] % mod;
}

ll C(int n, int m)
{
    
	return fac[n] * inv[n - m] % mod * inv[m] % mod;
}

pii s[N];
int main()
{
    
	IOS;
	init();
	int n, m; cin >> n >> m;
	for (int i = 1; i <= m; i++)
		cin >> s[i].ft >> s[i].sd;

	s[m + 1] = {
     n, n };
	for (int i = 1; i <= m + 1; i++)
	{
    
		f[i] = C(s[i].ft + s[i].sd - 2, s[i].ft - 1);
		for (int j = 1; j < i; j++)
		{
    
			ll t = C(s[i].ft - s[j].ft + s[i].sd - s[j].sd, s[i].ft - s[j].ft);
			f[i] = ((f[i] - f[j] * t % mod) % mod + mod) % mod;
		}
	}
	cout << f[m + 1] << endl;


	return 0;
}
原网站

版权声明
本文为[to cling]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/162/202206110321474120.html