ABC135 D Digits Parade

問題

atcoder.jp

コード

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <stack>
#include <sstream>
#include <list>
 
using namespace std;
 
#define rep(i, n) for(ll i = 0; i < (ll)(n); i++)
#define PB push_back
#define PF push_front
#define MP make_pair
 
 
typedef long long int ll;
typedef pair<int, int> Pii;
typedef pair<int, double> Pid;
typedef pair<double, int> Pdi;
typedef pair<double, double> Pdd;
typedef pair<ll, ll> P;
typedef pair<P, ll> PP;
 
 
const ll mod = 1e9+7;
const ll INF = 2e9;
const double epsilon = 1e-7;
const double PI = 3.1415926535;
 
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

string s;

int main(){
  cin >> s;
  int N = s.size();
  
  ll dp[100010][13];
  
  memset(dp,0,sizeof dp);
  dp[0][0] = 1;
  
  for(int i = 1;i < N + 1;i++){
    if(s[i-1] != '?'){
      int t = s[i-1] - '0';
      rep(j,13){
        dp[i][(10*j+t)%13] = dp[i-1][j];
        dp[i][(10*j+t)%13] %= mod;
      }
    }else{               //s[i]が'?'の時
      rep(k,13){ 
        rep(j,13){
          if((13 + k - (10*j)%13)%13 <10){
            dp[i][k] += dp[i-1][j];
            dp[i][k] %= mod;
          }
        }
      }
    }
  }

  cout << dp[N][5] << endl;

}

方針

dpを使った。  dp[i][j]=(与えられら条件を満たす)  i桁までの数字で13で割った余りがjになるものの個数。