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銆戠エ鏁扮粺璁?缁勫悎+瀹规枼的主要内容,如果未能解决你的问题,请参考以下文章