日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Code Festival 2017 qualA E-Modern Painting

發(fā)布時間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Code Festival 2017 qualA E-Modern Painting 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

給定一個n?m的網格。一些人站在網格的邊界上。
一個人可以占據他面前的一行(列),過程是一直往前染色(每個人的顏色都不一樣),直到下一個格子染上了顏色或者到達了邊界。
顯然不同順序會有不同的最終狀態(tài)。
求最終狀態(tài)的方案數。
n,m105

Solution

好難啊,一點都不會做QAQ。
可以先假設是豎直方向的人先占據格子。(水平情況一樣計算)
因為若有LR已經先占據了格子,那么(L,R)的格子也一定是會被豎直方向的人占領。
那么必定是一個區(qū)間[L,R]中的人一起先占據了一些格子。
考慮計算這種情況下的答案,答案就是下面三種數值的乘積:

  • 考慮[1,L?1]的網格,按不同順序所得到的答案。
  • 考慮[R+1,m]的網格,按不同順序所得到的答案。
  • 考慮[L,R]的網格中,位置i有上下兩個人可以選擇占據。其貢獻為2k

現在只要計算出第一個值(第二個值方法類似)。
設面向右的人有X個,向下的Y個,向上的Z個。
其答案的形式一定是這樣的。

把它下半部分的翻轉一下就得到了一個相當于從(0,0)(Y+Z,X)的路徑方案數的東西(好大啊)。
因為必須要經過翻轉的那一條邊,所以貢獻就是

(X+Y+ZX)?(X+Y+Z?1X)=(X+Y+Z?1X?1)
然后存一下后綴前綴之類的搞一搞就好啦。
復雜度 O(n+m)

#include <bits/stdc++.h> using namespace std;const int N = 301010; const int MOD = 998244353; const int INV = (MOD + 1) >> 1; typedef long long ll;char S[N]; int fac[N << 2], inv[N << 2]; int v[N][2], h[N][2]; int pre[N], suf[N], p2[N]; int n, m, lim, ans;inline void Mod(int &x) {while (x >= MOD) x -= MOD; } inline int Pow(int a, int b) {int c = 1;while (b) {if (b & 1) c = (ll)c * a % MOD;b >>= 1; a = (ll)a * a % MOD;}return c; } inline int Inv(int x) {return Pow(x, MOD - 2); } inline int C(int n, int m) {return (ll)fac[n] * inv[m] % MOD * inv[n - m] % MOD; } inline int Calc(int X, int Y, int Z) {if (X == 0) return (Y + Z) ? 0: 1;return C(X + Y + Z - 1, X - 1); } inline void Solve(void) {static int x, y, z;memset(p2, 0, sizeof p2);memset(suf, 0, sizeof suf);x = y = z = 0;for (int i = 1; i <= n; i++) x += h[i][1];p2[0] = 1;for (int i = 1; i <= m; i++)Mod(p2[i] = p2[i - 1] << (v[i][0] & v[i][1]));for (int i = m; i; i--) {if (!v[i][0] && !v[i][1]) {suf[i] = suf[i + 1];continue;}Mod(suf[i] = suf[i + 1] + (ll)Calc(x, y, z) * p2[i] % MOD);y += v[i][0]; z += v[i][1];}x = y = z = 0;for (int i = 1; i <= n; i++) x += h[i][0];for (int i = 1; i <= m; i++) {if (!v[i][0] && !v[i][1]) continue;pre[i] = (ll)Calc(x, y, z) * Inv(p2[i - 1]) % MOD;Mod(ans += (ll)pre[i] * suf[i] % MOD);y += v[i][0]; z += v[i][1];} }int main(void) {freopen("1.in", "r", stdin);scanf("%d%d\n", &n, &m);lim = max(n, m) << 2;inv[1] = 1;for (int i = 2; i <= lim; i++)inv[i] = (ll)(MOD - MOD / i) * inv[MOD % i] % MOD;fac[0] = inv[0] = 1;for (int i = 1; i <= lim; i++) {fac[i] = (ll)fac[i - 1] * i % MOD;inv[i] = (ll)inv[i - 1] * inv[i] % MOD;}scanf("%s\n", S);for (int i = 1; i <= n; i++) h[i][0] = S[i - 1] - '0';scanf("%s\n", S);for (int i = 1; i <= n; i++) h[i][1] = S[i - 1] - '0';scanf("%s\n", S);for (int i = 1; i <= m; i++) v[i][0] = S[i - 1] - '0';scanf("%s\n", S);for (int i = 1; i <= m; i++) v[i][1] = S[i - 1] - '0';Solve(); lim >>= 2;for (int i = 1; i <= lim; i++) {swap(h[i][0], v[i][0]);swap(h[i][1], v[i][1]);}swap(n, m); Solve();cout << max(ans, 1) << endl; }

總結

以上是生活随笔為你收集整理的Code Festival 2017 qualA E-Modern Painting的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。