🔵

【ABC401】AtCoder Beginner Contest 401【C++】

に公開

コンテスト名

AtCoder Beginner Contest 401

コンテストURL

https://atcoder.jp/contests/abc401

開催日

2025/04/12 21:00–22:40


A: Status Code

解法

  • 問題文通りに判定する
ABC401A.cpp
#include <iostream>
using namespace std;

int main(){
    int s;
    cin >> s;

    if(s>=200 && s<=299){
        cout << "Success" << endl;
    }else{
        cout << "Failure" << endl;
    }

    return 0;
}

B: Unauthorized

解法

  • ログイン状態について記録しておき、問題文通りに操作する
ABC401B.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    int n;
    cin >> n;

    bool flag = false;
    string s;
    int cnt = 0;
    for(int i=0; i<n; i++){
        cin >> s;
        if(s=="login"){
            flag = true;
        }else if(s=="logout"){
            flag = false;
        }else if(s=="public"){
            continue;
        }else if(s=="private"){
            if(!flag){
                cnt++;
            }
        }
    }

    cout << cnt << endl;

    return 0;
}

C: K-bonacci

解法

  • 差分を利用する
  • K \leqq N のとき
    • i < K のとき、 A_i = 1
    • A_K = K
    • i > K のとき、 A_i = A_{i-1} + A_{i-1} - A_{i-K-i}
  • K > N のとき、 A_N = 1 であることに注意する
ABC401C.cpp
#include <iostream>
#include <vector>
using namespace std;

long long int mod(long long int x, long long int m){
    long long int res = x % m;
  
    if(res<0){
      res += m;
    }
  
    return res;
}

int main(){
    int n, k;
    cin >> n >> k;

    if(k>n){
        cout << 1 << endl;
        return 0;
    }

    vector<long long int> A(n+1);
    for(int i=0; i<k; i++){
        A[i] = 1;
    }

    int j = 0;
    A[k] = k;
    for(int i=k+1; i<=n; i++){
        A[i] = 2 * A[i-1] - A[j];
        j++;
        A[i] = mod(A[i], 1000000000);
    }

    cout << mod(A[n], 1000000000) << endl;

    return 0;
}

Discussion