SRM478 Div2

勉強になる。

250 KiwiJuiceEasy

やるだけだった。

500 CarrotJumping

今いるところxから、「4*x+3」か「8*x+7」の場所へ飛べる。100000回まで繰り返して、100,000,007で割り切れる場所でとまれるかどうか、止まれる回数を出力。

mod 1000000007で考えるのはいいけど、

bool memo[1000000007];
for(int i=0; i<1000000007; i++) memo[i] = false; //あほ

とかやったら2秒じゃ終わらなくてorz
とりあえず全探索してみようと思ったら全然計算が終わらない&上のせいで計算済みの場所も無駄に計算。
数学的に簡単な式で表現できるのかといじってみてもうまくできず。惨敗。

結局、聞いたところ、メモ付きBFSでできたということで、書いたら通った。

class CarrotJumping {
  public:
  int theJump(int init) {
    ll a;
    vector<ll> n, p;
    p.push_back(init);
    map<ll,int> memo;
    for(int s=1; s<=100000; s++){
      n = p;
      p.clear();
      for(int i=0; i<n.size(); i++){
        if(memo[n[i]]==0){
          memo[n[i]] = 1;
          a = n[i];
          a = (4*a+3)%1000000007;
          if(a==0) return s;
          if(memo[a]==0) p.push_back(a);
          a = n[i];
          a = (8*a+7)%1000000007;
          if(a==0) return s;
          if(memo[a]==0) p.push_back(a);
        }
      }
    }
    return -1;
  }
};

1000

見てない。

撃墜

ソース見てたら怪しいことやってたのでやってみたら失敗したorz -25
もっと慎重に。

反省

  • 撃墜は慎重に。
  • メモはmapを使うようにする。