AtCoder Beginner Contest 042/AtCoder Regular Contest 058

はい。
https://atcoder.jp/contests/abc042
https://atcoder.jp/contests/arc058

A - 和風いろはちゃんイージー / Iroha and Haiku (ABC Edition)

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    printf("%s\n",(a==5 || a==7) && (b==5 || b==7) && (c==5 || c==7) && (a+b+c==17)?"YES":"NO");
 
    return 0;
}

Python3

a=[int(i) for i in input().split()]
a.sort()
print("YES" if a[0]==a[1]==5 and a[2]==7 else "NO")

a,b,cをソートして先頭から5,5,7を見たほうが判定時の書き方はシンプルじゃないかな、と思います。今回はソートしないでa,b,cいずれも5or7で合計17とか力技な判定させましたけど。。

B - 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition)

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,l;
    cin >>n >>l;
 
    vector<string> s(n);
    for (auto&e:s) cin >>e;
    sort(s.begin(),s.end());
 
    for (int i=0;i<n;i++) cout <<s[i];
    cout <<endl;
 
    return 0;
}

Python3

n,l=map(int,input().split())
d=[input() for i in range(n)]
d.sort()
ans=""
for i in d: ans+=i
print(ans)

C++のstringはよくわかりません。これくらいの問題だったらPythonで書くほうがいい気がします。

C - こだわり者いろはちゃん / Iroha's Obsession

C++14

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,k,f=0,tmp,chk;
    bool b[10]={0};
    scanf("%d %d",&n,&k);
    vector<int> d(k);
    for(auto&e:d) scanf("%d",&e);
    for (int i=0;i<k;i++) b[d[i]]=1;
    for (int i=n;i<100000;i++) {
        f=0;
        tmp=i;
        while (tmp>0) {
            chk=tmp%10;
            tmp/=10;
            if (b[chk]==1) {
                f=1;
                break;
            }
        }
        if (f==0 && i>=n) {
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}

Python3

n,k=map(int,input().split())
d=[int(i) for i in input().split()]
t=n
while 1:
    x=t
    while 1:
        if x%10 in d:
            break
        else:
            x//=10
        if x==0:
            print(t)
            exit()
    t+=1

+1しながら使えない数を使っていないか確認する。

D - いろはちゃんとマス目 / Iroha and a Grid

C++14

#include<bits/stdc++.h>
using namespace std;
 
const int MAX=510000;
const int MOD=1000000007;
 
long long fac[MAX], finv[MAX], inv[MAX];
 
void COMinit() {
    fac[0]=fac[1]=1;
    finv[0]=finv[1]=1;
    inv[1]=1;
    for (int i=2;i<MAX;i++) {
        fac[i]=fac[i-1]*i%MOD;
        inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;
        finv[i]=finv[i-1]*inv[i]%MOD;
    }
}
long long COM(int n,int k) {
    if (n<k) return 0;
    if (n<0 || k<0) return 0;
    return fac[n]*(finv[k]*finv[n-k]%MOD)%MOD;
}
int main(){
    COMinit();
    int h,w,a,b,ans=0,ex=0,t;
    scanf("%d %d %d %d",&h,&w,&a,&b);
    t=h-a;
    for (int i=0;i<(w-b);i++) {
        ans+=(COM(t+b-1+i,t-1)*COM(a+(w-b)-2-i,a-1))%MOD;
        ans%=MOD;
    }
    printf("%d\n",ans);
    return 0;
}

サンプル2で図を起こしてみると、スタートOからゴールZまで移動するにはp -> P, q -> Q, r -> R いずれかの経路を通る必要がある。なのでO -> pまでの組合せとP -> Zまで組合せの積を求めてq, rも同様に計算してその総和が解になります。多分。解説にもそう書いてあります。多分。

f:id:clarinet758:20181208145204p:plain
サンプル2の図