zoukankan      html  css  js  c++  java
  • atcoder grand contest 040 F Two Pieces

    传送门:https://atcoder.jp/contests/agc040/tasks/agc040_f

    sol:

    首先 这题我不会

    看了官方的题解才会的……这里只是写一下自己的理解x

    如果有错可以私聊我qwq

    我们现在用$(x,d)$表示一个状态

    这个状态定义为比较大的那个点在$x$位置,两个点之间的距离是$d$

    接下来我们就可以把操作抽象成如下的三个东西

    $(I)$把$x$和$d$同时$-1$

    $(II)$把$d$ $-1$ $[d>=2]$

    $(III)$把$d$设为$0$

    接下来我们就考虑先做$I$操作和$II$操作

    假设我们已经排列好了$I$和$II$操作,考虑怎么把$III$操作插入这个序列中

    考虑$III$操作能插入的位置

    抄一段题解x

    the  value  of  d  will  never  be  equal  to  or  less  than  its  current  value  again.

    也就是说只能把$III$插入$d$不会比后面任何$d$大的情况操作的后面

    在插入完$C$操作的时候,$d$的值要是$B-A$

    所以我们必须插入$III$ 其中$d$的值最终是$A-k$的时候

    将$III$的其余$N-B-k-1$次,插入到最后一次$d$值变为$0、1,... A-k$的任何位置。

    于是我们考虑枚举一个$k$

    我们可以分开处理操作$I$和操作$II$的总方案和插入$III$的方案

    $I$和$II$的操作可以类似$catalan$数的操作,考虑枚举一个位置不合法之后翻转一下

    翻转完之后就可以直接统计

    $III$操作是个经典的隔板

    然后就好像做完了x

    #include <bits/stdc++.h>
    using namespace std;
    int N,a,b,ans;
    int fac[10000005],inv[10000005];
    const int fish=998244353;
    int Pow(int x,int y){
        int ans=1;
        for (;y;y>>=1,x=1ll*x*x%fish) if (y&1) ans=1ll*ans*x%fish;
        return ans;
    }
    void Pre(){
        fac[0]=1;
        for (int i=1;i<=10000000;i++)
            fac[i]=1ll*fac[i-1]*i%fish;
        inv[10000000]=Pow(fac[10000000],fish-2);
        for (int i=9999999;i>=0;i--)
            inv[i]=1ll*inv[i+1]*(i+1)%fish;
    }
    int C(int n,int r){return 1ll*fac[n]*inv[r]%fish*inv[n-r]%fish;}
    int catalan(int x,int y){return ((C(x+y,y)-C(x+y,y-1))+fish)%fish;}
    int main(){
        Pre();
        scanf("%d%d%d",&N,&a,&b);
        if (b==0){
            cout<<1;
            return 0;
        }
        for (int i=0;i<=min(min(a,N-b),b-1);i++){
            int tot=catalan(b-1,i);
            if (i+b==N){
                if (a==i)
                    (ans+=tot)%=fish;
            }
            else {
                int x=N-b-i-1;
                int y=b-i-(b-a)+1;
                (ans+=1ll*tot*C(x+y-1,x)%fish)%=fish;
            }
        }
        cout<<ans;
    } 
  • 相关阅读:
    Java
    oracle与mysql(2)
    oracle与mysql
    junit中的assert方法总结
    java Future用法和意义一句话击破
    Java序列化中的SerialVersionUid
    Nginx了解
    现如今的CDN网站加速技术,细说CDN
    slf4j日志的使用
    IDEA 快捷键整理
  • 原文地址:https://www.cnblogs.com/si--nian/p/11793285.html
Copyright © 2011-2022 走看看