bzoj 1856: [Scoi2010]字符串
阿新 • • 發佈:2017-09-24
可能 can day2 arc space 輸出數據 problems 還要 str
2
1856: [Scoi2010]字符串
Time Limit: 5 Sec Memory Limit: 64 MBDescription
lxhgww最近接到了一個生成字符串的任務,任務需要他把n個1和m個0組成字符串,但是任務還要求在組成的字符串中,在任意的前k個字符中,1的個數不能少於0的個數。現在lxhgww想要知道滿足要求的字符串共有多少個,聰明的程序員們,你們能幫助他嗎?Input
輸入數據是一行,包括2個數字n和mOutput
輸出數據是一行,包括1個數字,表示滿足要求的字符串數目,這個數可能會很大,只需輸出這個數除以20100403的余數Sample Input
2 2Sample Output
HINT
【數據範圍】
對於30%的數據,保證1<=m<=n<=1000
對於100%的數據,保證1<=m<=n<=1000000
Source
Day2
Code:
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #define MOD 20100403 using namespace std; long long x,y,n,m,p,f[2000008],a,b,x1,y1,ans; void exgcd(long long a,longlong b){ if(b==0){ x=1,y=0; return; } exgcd(b,a%b); long long t=x; x=y; y=t-a/b*y; } void init(){ f[0]=1; for(int i=1;i<=n+m;i++) f[i]=f[i-1]*i%MOD; } int main(){ scanf("%lld%lld",&n,&m); init(); a=n+m; b=m; long long gay1=1,gay2=1; for(int i=1;i<=b;i++){ exgcd(i,MOD); x=(x+MOD)%MOD; gay1=gay1*x%MOD; if(i==b-1) x1=gay1; } for(int i=1;i<=a-b;i++){ exgcd(i,MOD); x=(x+MOD)%MOD; gay2=gay2*x%MOD; } exgcd(a-b+1,MOD); x=(x+MOD)%MOD; y1=gay2*x%MOD; ans=(f[a]*gay1%MOD*gay2%MOD-f[a]*x1%MOD*y1%MOD+MOD)%MOD; printf("%lld",ans); }
bzoj 1856: [Scoi2010]字符串