ABC135 D Digits Parade
問題
コード
#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を使った。 ]]=(与えられら条件を満たす)桁までの数字で13で割った余りがになるものの個数。