1. 程式人生 > >bzoj 1856: [Scoi2010]字符串

bzoj 1856: [Scoi2010]字符串

可能 can day2 arc space 輸出數據 problems 還要 str

1856: [Scoi2010]字符串

Time Limit: 5 Sec Memory Limit: 64 MB

Description

lxhgww最近接到了一個生成字符串的任務,任務需要他把n個1和m個0組成字符串,但是任務還要求在組成的字符串中,在任意的前k個字符中,1的個數不能少於0的個數。現在lxhgww想要知道滿足要求的字符串共有多少個,聰明的程序員們,你們能幫助他嗎?

Input

輸入數據是一行,包括2個數字n和m

Output

輸出數據是一行,包括1個數字,表示滿足要求的字符串數目,這個數可能會很大,只需輸出這個數除以20100403的余數

Sample Input

2 2

Sample Output

2

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,long
long 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]字符串