10.12 考试 第一题 字符串题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.12 考试 第一题 字符串题解相关的知识,希望对你有一定的参考价值。

字符串

时间限制: 1 Sec  内存限制: 64 MB

题目描述

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

  当时这道题真心脑子犯笨,明明是做过的原题,但就是没反应过来,还现场打表找规律,感觉自己像个傻子一样,先打了一个多小时找规律,没找出来,又在打完第三题和第二题暴力后回来接着打了40分钟的表,终于找到规律才A了,然而别人都是花了不到十分钟A掉的,说不定如果我当时早早A掉这次可能就AK了。

  直接说结论吧,C(n+m,n)-C(m-1)。打完就没了……

技术分享
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <queue>
 6 #include <algorithm>
 7 #include <cmath>
 8 #include <map>
 9 #define N 1000010
10 using namespace std;
11 int n,m,p=20100403;
12 long long jc[N*2];
13 long long exgcd(long long a,long long b,long long c)
14 {
15     if(!a)return -1;
16     if(c%a==0)return c/a;
17     long long t=exgcd(b%a,a,(((-c%a)+a)%a));
18     if(t==-1)return t;
19     return (b*t+c)/a;
20 }
21 void init()
22 {
23     jc[0]=1;
24     for(int i=1;i<=N*2+5;i++)
25     {
26         jc[i]=(jc[i-1]*i)%p;
27     }
28 }
29 long long get_c(int a,int b)
30 {
31     return ((jc[a]*exgcd(jc[b],p,1)%p)*exgcd(jc[a-b],p,1)%p)%p;
32 }
33 long long ksm(long long x,long long z)
34 {
35     long long ans=1;
36     while(z)
37     {
38         if(z&1)
39         {
40             ans*=x;
41             ans%=p;
42         }
43         x*=x;x%=p;
44         z>>=1;
45     }
46     return ans;
47 }
48 long long f[2005][2005];
49 int main()
50 {
51     init();
52     scanf("%d%d",&n,&m);
53     if(n==m)
54     {
55         long long ans=get_c(n*2,n);
56         ans*=exgcd(n+1,p,1);
57         ans%=p;
58         printf("%lld\n",ans);
59     }
60     else if(n<=1000)
61     {
62         memset(f,0,sizeof(f));
63         f[1][1]=1;
64         for(int i=2;i<=n+m;i++)
65         {
66             for(int j=(i+1)/2;j<=i&&j<=n;j++)
67             {
68                 f[i][j]+=f[i-1][j-1];
69                 f[i][j]%=p;
70                 if(i-j<=j)f[i][j]+=f[i-1][j];
71                 f[i][j]%=p;
72             }
73         }
74         printf("%lld\n",f[n+m][n]);
75     }
76     else
77     {
78         long long ans=get_c(m+n,m);
79         ans*=(n-m+1);
80         ans%=p;
81         ans*=exgcd(m+2+n-m-1,p,1);
82         ans%=p;
83         printf("%lld\n",ans);
84     }
85     return 0;
86 }
View Code

 







以上是关于10.12 考试 第一题 字符串题解的主要内容,如果未能解决你的问题,请参考以下文章

9.5 考试 第一题 礼物题解

9.18考试 第一题count题解

9.16考试 第一题 X国的军队题解

10.12 考试 第二题 乌鸦喝水题解

七中高新 NOIP模拟题 第一题 黄金拼图题解

6.5 THUSC 考试题解