UOJ#209. 銆怳ER #6銆戠エ鏁扮粺璁?缁勫悎+瀹规枼

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UOJ#209. 銆怳ER #6銆戠エ鏁扮粺璁?缁勫悎+瀹规枼相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/set' title='set'>set   operator   oid   return   highlight   缁熻   nod   涓暟   efi   

鑷繁鐙珛鎯冲嚭鏉ョ殑锛屽紑蹇?         

棣栧厛锛屽浜?$x$ 涓嶇瓑浜?$y$ 鐨勬儏鍐碉紝鏄剧劧鍙檺鍒跺墠缂€/鍚庣紑.    

鐒跺悗濡傛灉娌℃湁 x 涓?y 鐩哥瓑鐨勬儏鍐电殑璇濇垜浠畬鍏ㄥ彲浠ユ灇涓炬€荤殑 1 鐨勪釜鏁帮紝鐒跺悗闄愬埗鍚庣紑鐨勫氨鍙互杞寲鎴愰檺鍒跺墠缂€鐨?   

濡傛灉寮曞叆 x 涓?y 鐩哥瓑鐨勬儏鍐碉紝涔熷氨鏄瑕佹眰鍓嶇紑鎴栧悗缂€閮藉~婊′篃鎸夌収涓婅堪鏂瑰紡澶勭悊鍗冲彲.  

浣嗘槸瑕佺畝鍗曞鏂ヤ竴涓嬶紝鍗?ans(鍓嶇紑)+ans(鍚庣紑)-ans(鍓嶅悗缂€)    

code:  

#include <bits/stdc++.h>    
#define N 5009   
#define ll long long
#define mod 998244353 
#define setIO(s) freopen(s".in","r",stdin) // , freopen(s".out","w",stdout)  
using namespace std;     
int C[N][N],n,m,lim,tot; 
struct node { int x,y; } ch[N];  
struct data 
{ 
    int x,y; 
    bool operator<(const data b) const { return x<b.x; }   
}tmp[N],A[N];         
void init() 
{
    C[0][0]=1;   
    for(int i=1;i<N;++i)
    {
        C[i][0]=1;  
        for(int j=1;j<=i;++j) C[i][j]=(ll)(C[i-1][j]+C[i-1][j-1])%mod;   
    }                                 
}         
int sol() 
{        
    sort(tmp+1,tmp+1+tot);     
    if(tmp[1].x==0&&tmp[1].y) return 0;     
    int ans=1,dist,det; 
    tmp[0].x=0,tmp[0].y=0;       
    for(int i=1;i<=tot;++i) 
    {    
        det=tmp[i].y-tmp[i-1].y;  
        dist=tmp[i].x-tmp[i-1].x;       
        if(dist<det||tmp[i].y<0||det<0) return 0;        
        ans=(ll)ans*C[dist][det]%mod;   
    }           
    return ans;   
}
int calc(int TOT)       
{
    // 鎬诲叡鏈?TOT 涓?1    
    tot=0;              
    for(int i=1;i<=m;++i) 
    {
        if(ch[i].x!=ch[i].y)  
        {   
            ++tot; 
            if(ch[i].x>ch[i].y) {        
                A[tot].x=ch[i].x;  
                A[tot].y=ch[i].y;    
            }
            else {   
                A[tot].x=n-ch[i].y;  
                A[tot].y=TOT-ch[i].x;              
            }     
        }
    }         
    ++tot;  
    A[tot].x=n;  
    A[tot].y=TOT;              
    int ans=0;             
    if(!lim) {       
        for(int i=1;i<=tot;++i) tmp[i]=A[i];   
        return sol();  
    }   
    else {       
        ++tot;   
        //============================ 鍙湁鍓?
        A[tot].x=lim;  
        A[tot].y=lim;   
        for(int i=1;i<=tot;++i) tmp[i]=A[i];        
        (ans+=sol())%=mod;        
        //============================ 鍙湁鍚?  
        A[tot].x=n-lim;          
        A[tot].y=TOT-lim;      
        for(int i=1;i<=tot;++i) tmp[i]=A[i];  
        (ans+=sol())%=mod;     
        //============================ 鍓嶅悗閮芥湁      
        ++tot;  
        A[tot].x=lim;  
        A[tot].y=lim;  
        for(int i=1;i<=tot;++i) tmp[i]=A[i];   
        (ans+=mod-sol())%=mod;                 
        return ans; 
    }
}
void solve() 
{
    scanf("%d%d",&n,&m);      
    for(int i=1;i<=m;++i) {
        scanf("%d%d",&ch[i].x,&ch[i].y);   
        if(ch[i].x==ch[i].y) lim=max(lim,ch[i].x);        
    }                            
    // 搴忓垪涓湁 i 涓?1                         
    int ans=0;    
    for(int i=0;i<=n;++i) 
    {        
        ans+=calc(i);              
        if(ans>=mod) ans-=mod;
    }    
    printf("%d
",ans);   
    lim=tot=0;   
}
int main() 
{
    // setIO("input");     
    int T;  
    init();  
    scanf("%d",&T);   
    while(T--) solve();                     
    return 0; 
}

銆€銆€

 

以上是关于UOJ#209. 銆怳ER #6銆戠エ鏁扮粺璁?缁勫悎+瀹规枼的主要内容,如果未能解决你的问题,请参考以下文章

涓€缁?amp;&浜岀淮鏍戠姸鏁扮粍

UOJ310. 銆怳NR #2銆戦粠鏄庡墠鐨勫阀鍏嬪姏 [FWT]

uoj#209. UER #6票数统计

uoj#209[UER #6]票数统计 组合数+乱搞

6绉岼avaScript缁ф壙鏂瑰紡鍙婁紭缂虹偣

uoj#213. UNR #1争夺圣杯