Submission #1797229


Source Code Expand

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>

using namespace std;

typedef long long ll;
#define MOD 1000000007
#define MAX_len 10001
#define MAX_D 100
#define modp(x,y) ((x % y) + y) % y

int main(int argc, const char * argv[]) {
    // dp[i][p] : Nの先頭から(i+1)文字目までの(i+1)桁の整数以下で, 各桁の総和がp(mod D)となる非負整数の個数(mod MOD)
    ll dp[MAX_len][MAX_D];
    // c[i] : Nの先頭から(i+1)文字目までの(i+1)桁の総和(mod D)
    int c[MAX_len];
    
    int D;
    cin >> D;
    string str;
    cin >> str;
    
    int len = int(str.size());
    
    int N[MAX_len];
    for (int i = 0; i < len; i++) {
        N[i] = int(str[i]) - int('0');
    }
    
    for (int i = 0; i < len; i++) {
        if (i == 0) c[i] = N[i] % D;
        else c[i] = modp(c[i-1] + N[i], D);
    }
    
    for (int i = 0; i < len; i++) {
        for (int p = 0; p < D; p++) {
            if (i == 0) {
                for (int n = 0; n < N[i]+1; n++) {
                    if (modp(n, D) == p) dp[i][p]++;
                }
            } else {
                long long sum = 0;
                for (int n = 0; n < 10; n++) {
                    sum += dp[i-1][modp((p-n),D)];
                }
                for (int n = N[i] + 1; n < 10; n++) {
                    if ((c[i-1] + n) % D == p) sum = modp(sum - 1, MOD);
                }
                dp[i][p] = sum % MOD;
            }
        }
    }
    
    cout << modp(dp[len-1][0] - 1, MOD) << endl;
    return 0;
}

Submission Info

Submission Time
Task E - 数
User habara_k
Language C++14 (GCC 5.4.1)
Score 4
Code Size 1610 Byte
Status AC
Exec Time 71 ms
Memory 8192 KB

Judge Result

Set Name All
Score / Max Score 4 / 4
Status
AC × 5
Set Name Test Cases
All 00, 01, 02, 90, 91
Case Name Status Exec Time Memory
00 AC 2 ms 2304 KB
01 AC 44 ms 8192 KB
02 AC 71 ms 8064 KB
90 AC 1 ms 256 KB
91 AC 2 ms 2304 KB