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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2019牛客多校Monotonic Matrix

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2019牛客多校Monotonic Matrix 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Monotonic Matrix

題意:

問有多少個n * m的矩陣A滿足一下情況:答案mod 1e9+7

  • 矩陣A的所有元素∈{0,1,2}
  • Ai,j<=Ai+1,jA_{i,j}<=A_{i+1,j}Ai,j?<=Ai+1,j?
  • Ai,j<=Ai,j+1A_{i,j}<=A_{i,j+1}Ai,j?<=Ai,j+1?
  • 題解:

    我們先看看這個式子有啥規律?
    對于每一行,每一列都是非下降序列,也就是說如果有一位是2,其后面都是2,如果有一位是1,其前面都是1
    那我們考慮元素01和12的分界線
    是(n,0)到(0,m)的兩條不相交(可重合的路徑)
    第一個分界線以上的點是一種,兩條分界線之間是一種,第二個分界線以下是一種(詳細看圖)

    不過現在這個兩個線的起終點一樣,我們可以將第一個線進行偏移,變成起點為(n-1,-1)到(-1,m-1).(注意這兩個線不是弧形的,而是水平豎直線)
    現在問題就是起點為(n-1,-1),終點為(-1,m-1)和起點為(n,0),終點為(0,m),兩個不相交路徑的條數
    怎么做?引入LGV定理
    就有:
    起點{a1,a2a_{1},a_{2}a1?,a2?}={(n,0),(n?1,?1)(n,0),(n-1,-1)(n,0),(n?1,?1)}
    終點{b1,b2b_{1},b_{2}b1?,b2?}={(0,m),(?1,m?1)(0,m),(-1,m-1)(0,m),(?1,m?1)}
    帶入公式:
    ans=∣(a1,b1)(a1,b2)(a2,b1)(a2,b2)∣ans= \begin{vmatrix} (a_{1},b_{1})&(a_{1},b_{2})\\ (a_{2},b_{1})&(a_{2},b_{2})\\ \end{vmatrix} ans=?(a1?,b1?)(a2?,b1?)?(a1?,b2?)(a2?,b2?)??
    (a1,b1)(a_{1},b_{1})(a1?,b1?)表示從(n,0)到(0,m)的路徑數,從(n,0)到(0,m)共有n+m步,我們選擇其中n步向上走,剩下的自然是向右走,共Cn+mnC_{n+m}^{n}Cn+mn?種方法,其他同理
    最終答案ans=Cn+mn?Cn+mn?1?Cn+mm?1?Cn+mnC_{n+m}^{n}*C_{n+m}^{n-1}-C_{n+m}^{m-1}-C_{n+m}^{n}Cn+mn??Cn+mn?1??Cn+mm?1??Cn+mn?

    代碼:

    #include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime = clock ();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } const int maxn=3e6+9; const int mod=1e9+7; ll inv[maxn]; ll f[maxn]; ll f0[maxn]; void init(int N){inv[1]=inv[0]=1;f[1]=f[0]=1;f0[0]=f0[1]=1;for(int i=2;i<=N;i++){f[i]=f[i-1]*i%mod;f0[i]=(mod-mod/i)*f0[mod%i]%mod;inv[i]=inv[i-1]*f0[i]%mod;} } ll C(ll a,ll b){return 1ll*f[a]*inv[b]%mod*inv[a-b]%mod; } int main() {//rd_test();init(10000);ll n,m;while(~scanf("%lld%lld",&n,&m)){cout<<(C(n+m,n)*C(n+m,n)%mod-C(n+m,n-1)*C(n+m,m-1)%mod+mod)%mod<<endl;}//Time_test(); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的2019牛客多校Monotonic Matrix的全部內容,希望文章能夠幫你解決所遇到的問題。

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