AtCoder Beginner Contest 042

本文详细介绍了AtCoder Beginner Contest 042的四个问题:A - Iroha and Haiku,B - Iroha Loves Strings,C - Iroha’s Obsession和D - Iroha and a Grid。对于每个问题,提供了题目大意、详细思路以及具体的解决方案,涉及算法和C++编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A - Iroha and Haiku (ABC Edition)

题目大意

判断三个数中是否有两个5和一个7

详细思路

暴力判断即可

具体实现
#include<cstdio>
int a,b,c;
int main(){
    scanf("%d %d %d",&a,&b,&c);
    if((a==5&&b==5&&c==7)||(a==5&&b==7&&c==5)||(a==7&&b==5&&c==5))printf("YES");
    else printf("NO");
}

B - Iroha Loves Strings (ABC Edition)

题目大意

nnn个字符串按字典序排序

详细思路

用系统自带string,sortstring,sortstring,sort即可顺利解决

具体实现
#include<bits/stdc++.h>
using namespace std;
int n,m;string a[10005];
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)printf("%s",a[i].c_str());
}

C - Iroha’s Obsession

题目大意

求大于等于NNN且满足十进制下每一位数字都不在DDD数组的最小值

详细思路

NNN开始枚举且判断,遇到第一个满足条件的值就输出结束程序

具体实现
#include<cstdio>
int n,k,x,a[10005],b[15],z;
int main(){
    scanf("%d %d",&n,&k);
    for(int i=1;i<=k;i++){scanf("%d",&x);b[x]=1;}
    for(int i=n;;i++){
        z=0;x=i;
        while(x>0){z=z|b[x%10];x/=10;}
        if(z==0){printf("%d",i);return 0;}
    }
}

D - Iroha and a Grid

题目大意

n∗mn*mnm的格子中,只能向右和向下走,左下的 a∗ba*bab的格子不能走

求从左上走到右下的方案数

详细思路

设左上格子坐标为(1,1)(1,1)(1,1),右下格子为(n,m)(n,m)(n,m)

把图按照n−a+1n-a+1na+1的线分割

枚举iiib+1b+1b+1mmm,从(1,1)(1,1)(1,1)(n−a,i)(n-a,i)(na,i)格子方案数为Cn−a+i−2n−a−1C^{n-a-1}_{n-a+i-2}Cna+i2na1,从(n−a+1,i)(n-a+1,i)(na+1,i)(n,m)(n,m)(n,m)格子方案数为Ca+m−i−3a−2C^{a-2}_{a+m-i-3}Ca+mi3a2

具体实现
#include<cstdio>
long long n,m,a,b,ans=0,JC[1000005],NY[1000005],mod=1e9+7,N=2e5;
long long ksm(long long t1,long long t2){
    long long t3=1;
    while(t2){
        if(t2&1)t3=t1*t3%mod;
        t1=t1*t1%mod;t2>>=1;
    }
    return t3;
}
long long C(long long t1,long long t2){return JC[t2]*NY[t1]%mod*NY[t2-t1]%mod;}
int main(){
    JC[0]=1;
    for(int i=1;i<=N;i++)JC[i]=JC[i-1]*i%mod;NY[N]=ksm(JC[N],mod-2);
    for(int i=N;i>=1;i--)NY[i-1]=NY[i]*i%mod;
    scanf("%lld %lld %lld %lld",&n,&m,&a,&b);a=n-a+1;
    for(int i=b+1;i<=m;i++){
        ans+=C(a-2,a+i-3)*C(n-a,n-a+m-i);ans%=mod;
    }
    printf("%lld",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值