tqk's diary

競プロとか

ABC106 A B C問題 [part1] - tqkoh's diary

これはアウトプットして自分の記憶を定着させ実力を高めるための記事です。公式の解説はここにあります。(公式には次パートで説明する二次元累積和については乗っていません)

https://img.atcoder.jp/abc106/editorial.pdf

part2:

tqk.hatenablog.jp

A問題

A - Garden

  • A*Bの土地に幅1の道を十字にひいたとき、残った土地を求める問題。

解法

  • 道の交差点が隅に来るように道を移動させ等積変形すると、 f:id:tako0608:20180819005000p:plain このようになります。よって答えは(A-1)(B-1)
#include "bits/stdc++.h"
using namespace std;
int main(){
    int a,b;cin>>a>>b;
    cout<<(a-1)*(b-1);
}

B問題

B - 105

  • 1からNまでの奇数で、約数が8この物の個数を求める問題。

解法

  • 全探索をします。1からNまでの奇数で約数が8この物を数えます。
#include "bits/stdc++.h"
using namespace std;
int main(){
    int n;cin>>n;
    int ans=0,ctr;
    for (int i=1; i<=n; i+=2){
        ctr=0;
        for (int j=1; j<=i; ++j)if(i%j==0)++ctr;
        if(ctr==8)++ans;
    }
    cout<<ans;
}

C問題

C - To Infinity

  • 数字のみからなる文字列Sの、各桁が一日ごとにその桁の数 倍になるとき、5000兆日後はK文字目を求める問題です。
  • どういうことかというと、"1234"が一日で"1223334444"になり、その次に"122223333333334444444444444444"になるということです。

    解法

  • "23"という文字列で考えると、2の桁数は2^{5000000000000000}に増えますから、 K \le 10^{18} より、Kがいくつであっても答えは"2"となります。ここから、1以外の数が出た瞬間、その数が答えになることがわかります。
  • 例えば、"1123"という文字列を考えてみると、5000兆日後には"11222222..."となります。よって、答えは、K<3(1以外が最初に出てくるところ)のとき 1、それ以外 2 となります。
  • 実装ですが、k番目まで見て行って1以外が出た瞬間にそれを出力、k番目まで1以外が出なければ1を出力、とするのが簡単だと思います。(--kをするのを忘れてWAしたなんて言えません)
#include "bits/stdc++.h"
using namespace std;
int main(){
    string s;cin>>s;
    int k;cin>>k;--k;//下のforの条件をi<kにすると--kは必要なくなる
    for (int i=0; i<=k; ++i)if (s[i]!='1'){
        cout<<s[i];
        return 0;
    }
    cout<<1;
}

D問題(次パート)

part2: D問題と今回のABCで学んだこと、二次元累積和についてを書きます

tqk.hatenablog.jp




他にもこんな記事を書いています tqk.hatenablog.jp

tqk.hatenablog.jp

qiita.com