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 }
以上是关于10.12 考试 第一题 字符串题解的主要内容,如果未能解决你的问题,请参考以下文章