mitchan5
@mitchan5 (hiro Minami)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Atcoder ABC129のC問題

解決したいこと

Atcoder ABC129のC問題を解きたいです。テストケースで5個ほどREが出る理由がわかりません。
https://atcoder.jp/contests/abc129/tasks/abc129_c

該当するソースコード

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

int main(){
  int64_t N,M; cin>>N>>M;
  
   //i段目まで障害物がなかった時の通りの総和
  vector<int64_t> vec(N+1);
  vec.at(0)=1; vec.at(1)=1;
  for(int i=2; i<=N; i++){
     vec.at(i)=vec.at(i-1)+vec.at(i-2);
     vec.at(i)%=1000000007;
  }
  
  //障害物が2個以上連続しているときは0になる
  vector<int64_t> a(M);
  cin>>a.at(0);
  for(int i=1; i<M; i++) {
     cin>>a.at(i);
     if(a.at(i)==a.at(i-1)+1){cout<<0<<endl;return 0;} 
  }
 
  //障害物間にある段数を上る通りをかけていく
  int64_t ans=vec.at(a.at(0)-1);//一個目の障害物までの通り
  for(int i=1; i<M; i++){
    ans*=vec.at(a.at(i)-a.at(i-1)-2);
    ans%=1000000007;
  }
  ans*=vec.at(N-a.at(M-1)-1);//最後の障害物からN段までの通り
  ans%=1000000007;
  
  cout<<ans<<endl;

}

自分で試したこと

障害物が連続していない条件で、障害物間の段数を上るパターンをそれぞれ求め、掛け算していきました。(障害物を超えるパターンは1段飛ばしのみ)

配列の要素数を超えないように、確認しました。
障害物が連続する場合など、すべてのパターンを考慮し、オーバーフローの確認もしました。
模範解説は理解ができたのですが、上記のコードでACが出ない理由がわかりませんでした。
よろしくお願いいたします。

0

1Answer

2つ目の制約

$0\leq M \leq N -1$

では$M=0$も含まれます.

対して,mitchanさんのコードでは

16-17行目
  vector<int64_t> a(M);
  cin>>a.at(0); // これを実行するには長さ1以上のvectorである必要がある

としているので,$M\geq1$でなければ配列aに対して範囲外アクセスが起き,REになります.今回は提出詳細欄で判定に使われた入出力がDropboxのリンクとして載っているので,どのケースに問題があったかも教えていただけると解答しやすくなります.全部みてはいませんが01.txt03.txt09.txt15.txt29.txtでは$M=0$のケースであることが確認できました.REになったものがこれと一緒であれば,原因は上述の通りです.

1Like

Comments

  1. @mitchan5

    Questioner

    いつもありがとうございます!
    M=0を考えていませんでした。M=0を場合分けしうまくいきました。
    ありがとうございます!!!

Your answer might help someone💌