原題鏈結
妹滋滋是乙個善於程式設計的女孩子。
但是某一天,她一不小心把 uoj 後台的票數統計程式寫錯了。
本來嘛在這種根本沒有什麼用的功能上出了 bug 也沒有什麼大關係,但是又有某一天,uoj 突然就開始搞全民公投了。
這可怎麼辦呢?如果這個訊息讓別人知道的話自己肯定會被查表,更不要說讓所有使用者重新來投一次票了。
作為乙個要強的女孩子,妹滋滋決定自力更生。
通過一些奧妙重重的方式,妹滋滋知道了一些關於這次全民公投的資訊。
這次全民公投一共有 n 位使用者排隊參加,編號為 1 到 n。每一位使用者要麼投了通過,要麼投了不通過。
有 mm 個二元組 (xi,yi),每個二元組給出這樣乙個資訊: 「前 xi位使用者中,恰好 yi 位投了通過」 和 「後 yi 位使用者中,恰好有 xi 位投了通過」 這兩句話中,至少有一句是成立的。
作為分析的第一步,她想要知道有多少種投票情況是滿足她所得到的資訊的。當然,可能所有投票情況都不滿足條件。
很顯然,當x>y時就是第二種情況,
而對於所有的x=y的情況,只有最大x是有用的,
所有我們列舉所有投票的人,這樣所有的對字尾的限制就變成了字首,
於是可以愉快的用c公式搞,
對於x=y,只要符合字首的情況+符合字尾的情況-兩個多符合的情況即可,
複雜度:o(
n2)
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int n=5555,mxlongint=2147483640,mo=998244353;
int read(int &n)
int n,m,m1,c;
ll ans;
struct qqww
a[n];
ll c[n][n];
bool px(qqww a,qqww b)
ll ss(int m1)
}else
}if(a[i].s==-1)
if(w<0||q<0)return
0; if(!c[q-l][w-l1])return
0; l=q,l1=w;
}if(l1<=c&&l1+q-l>=c)
if(n-l
<0||m1-l1<0)ans=0;else ans=(ans*c[n-l][m1-l1])%mo;
ans=ans;
if(!ans)c1=0;
}else c1=0;
if(!c)return ans;
l=n+1,l1=e=0;
fod(i,m,1)if(a[i].s!=-1)
}else
}if(a[i].s==2)
if(w-l1<0||q<0)return
0; if(!c[l-q][w-l1])return
0; l=q,l1=w;
}if(l1<=c&&l1+l-q>=c)
if(n-l
<0||m1-l1<0)ans=0;else ans=(ans*c[l][m1-l1])%mo;
ans+=ans;
}else c2=0;
if(ans&&c1&&c2)
if(c*2>=n)ans-=(m1==n);
else
if(m1>=c*2)
ans=(ans*c[n-c-l][m1-l1-c])%mo;
ans-=ans;
}return ans%mo;
}int main
() read(_);
while(_--)
fo(i,mx,n)ans=(ans+ss(i))%mo;
printf("%d\n",(ans+mo)%mo);
}return
0;}
uoj 209 UER 6A 票數統計
給出n個數,每個數是0或1.再給出m個限制,每個限制 x,y 表示 前x個數中有y個1 或 後y個數中有x個1 求這樣的序列的個數。n 5000,m 1000 再一次被uer給虐了。其實這道題劼鏼爺已經講的很清楚了。撲通撲通跪下來 當x y的時候,很顯然已經確定這個限制是限制字首還是字尾的。當x y...