bzoj 1856 //1856: [Scoi2010]字符串 dp动归/卡特兰数

bzoj 1856 //1856: [Scoi2010]字符串 //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1856

更多题解,详见https://blog.csdn.net/mrcrack/article/details/90228694BZOJ刷题记录

1.dp动归

//1856: [Scoi2010]字符串
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1856
//样例2 2解释如下
//所有可能1100,1010,1001,0011,0101,0110
//不可能1001,0011,0101,0110
//确定的情况1100,1010
//dp(动归)参考此文https://www.luogu.org/problemnew/solution/P1641?page=4   作者: UKE_Automaton 更新时间: 2018-04-02 16:00  
//f[i][j] i个1,j个0对应的方案数
//f[i][j]=f[i-1][j]+f[i][j-1]
//f[i-1][j]串尾补1 ==> f[i][j]
//f[i][j-1]串尾补0 ==> f[i][j]
//f[i][j]=f[i-1][j]+f[i][j-1]模拟如下,希望能通过模拟,看懂dp.2019-9-17
/*
1 0
1 f[1][0]=1

1 1
10 f[1][1]=f[1][0]+f[0][1]=1+0=1

2 1
110 101 f[2][1]=f[2][0]+f[1][1]=1+1=2  11=>110,10=>101

2 2
1100 1010 f[2][2]=f[2][1]+f[1][2]=2+0=2 110=>1100,101=>1010

3 1
1110 1101 1011 f[3][1]=f[3][0]+f[2][1]=1+2=3 111=>1110 110=>1101 101=>1011
*/
//此处https://www.luogu.org/problem/P1641提交dp代码,30分,测试点1-3AC.
#include <stdio.h>
#include <string.h>
#define LL long long
#define maxn 1010
#define mod 20100403
LL f[maxn][maxn];
int main(){
    int n,m,i,j;
    scanf("%d%d",&n,&m);
    memset(f,0,sizeof(f));
    for(i=1;i<=n;i++)f[i][0]=1;
    for(i=1;i<=n;i++)
        for(j=1;j<=i;j++)
            f[i][j]=(f[i-1][j]+f[i][j-1])%mod;
    printf("%lld\n",f[n][m]);
    return 0;
}

2.卡特兰数

//此文https://www.cnblogs.com/Essein/p/9734846.html思路很棒,摘抄如下

为什么要以y=-1作为对称轴呢,读者可以多画几副图,非法情况,一定是从(0,-2)出发,到达(n+m,n-m),中间不会出现线段的断裂。

//此文https://www.cnblogs.com/jianglangcaijin/p/3443689.html推导特别好,摘抄如下

(0,-2)->(n+m,n-m)计算出的方案,与(0,0)->(n+m,n-m)中的非法方案一一对应.故可抛开(0,0)->(n+m,n-m),直接(0,-2)->(n+m,n-m)计算出的方案作为非法方案.2019-9-17 20:53

2.1快速幂+乘法逆元  

820 kb488 ms

//快速幂+乘法逆元
//此文https://www.cnblogs.com/cjyyb/p/9837037.html代码写得不错
//样例通过,提交AC.2019-9-17 21:36
#include <stdio.h>
#define LL long long
#define mod 20100403
LL quick_pow(LL a,LL n){
    LL ans=1;
    while(n){
        if(n&1)ans=ans*a%mod;//此处错写成if(a&1)ans=ans*a%mod;,够昏
        a=a*a%mod;
        n/=2;
    }
    return ans;
}
LL C(LL n,LL m){//n!/((n-m)!m!)=n*(n-1)*(n-2)*...*(m+1)/(n-m)!
    LL a=1,b=1,i;
    for(i=n;i>m;i--)a=a*i%mod;
    for(i=n-m;i>=1;i--)b=b*i%mod;
    return a*quick_pow(b,mod-2)%mod;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%lld\n",(C(n+m,m)-C(n+m,m-1)+mod)%mod);
    return 0;
}

2.2扩展欧几里德算法+逆元

820 kb484 ms

//扩展欧几里德算法+逆元
//在纸上推了一遍 扩展欧几里德算法
//扩展欧几里德算法 编写完成后,不放心,又简单测试了。
//样例通过,提交AC.
//惊叹,第一次用 扩展欧几里德算法 求逆元,没想到,一次成功。2019-9-18
//推导过程如下
/*
ax+by=1
(1)ax+by=gcd(a,b)

bx'+a%by'=gcd(b,a%b)
bx'+(a-a/b*b)y'=gcd(b,a%b)
bx'+ay'-a/b*b*y'=gcd(b,a%b)
(2)ay'+b(x'-a/b*y')=gcd(b,a%b)

对比(1)、(2)可得
x=y',y=x'-a/b*y'
*/
#include <stdio.h>
#define LL long long
#define mod 20100403
void exgcd(LL a,LL b,LL *x,LL *y){//扩展欧几里德算法 求逆元 ax%b=1  => (ax-1)=by  => ax+by=1,x是a的逆元
    LL t;
    if(b==0){
        *x=1,*y=0;
        return;
    }
    exgcd(b,a%b,x,y);
    t=*x,*x=*y,*y=t-a/b**y;
}
LL C(LL n,LL m){
    LL c=1,a=1,i,x,y;
    for(i=n;i>m;i--)c=c*i%mod;
    for(i=n-m;i>=1;i--)a=a*i%mod;
    exgcd(a,mod,&x,&y);
    x=(x%mod+mod)%mod;
    return c*x%mod;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%lld\n",(C(n+m,m)-C(n+m,m-1)+mod)%mod);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值