正题
第二题:[SCOI2010]生成字符串
这一题可以用卡特兰数来解决。
我们利用数形结合的方法。建立平面直角坐标系,向上走一步指的是选1,想下走一步指的是选0.
而向右走就指的是当前选多一个数。
所以就有向右上的走法(选1)和右下的走法(选0)。
如果没有限制条件,那么答案就是C(n+m,n)=C(n+m,m);
如果加上了限制条件,那么就相当于当前的点不能在第四象限。
不行的方案数是C(n+m,m-1);
所以答案就是C(n+m,m)- C(n+m,m-1)。
费马小定理求逆元
代码<求逆元不懂看学习笔记哦>
#include<cstdio>
#include<cstdlib>
#include<cstring>
long long mod=20100403;
int n,m;
long long tot=1;
long long now=1;
void g(long long x,int t)
{
while(t>=1)
{
if(t%2==1)
{
now*=x;
now%=mod;
}
if(t==1) break;
x*=x;
x%=mod;
t/=2;
}
now%=mod;
return ;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=n+m;i>=n+2;i--)
{
tot*=i;
tot%=mod;
}
tot*=n+1-m;
tot%=mod;
for(long long i=m;i>=2;i--)
{
now=1;
g(i,mod-2);
tot*=now;
tot%=mod;
}
printf("%lld\n",tot);
}