Submission #1797216


Source Code Expand

#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;
    scanf("%d", &D);
    char str[MAX_len];
    scanf("%s", str);
    
    int len = int(strlen(str));
    
    int N[MAX_len];
    for (int i = 0; i < MAX_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;
            }
        }
    }
    
    
    printf("%lld\n", modp(dp[len-1][0] - 1, MOD));
    return 0;
}

Submission Info

Submission Time
Task E - 数
User habara_k
Language C++14 (GCC 5.4.1)
Score 0
Code Size 1622 Byte
Status CE

Compile Error

./Main.cpp: In function ‘int main(int, const char**)’:
./Main.cpp:24:29: error: ‘strlen’ was not declared in this scope
     int len = int(strlen(str));
                             ^
./Main.cpp:20:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &D);
                    ^
./Main.cpp:22:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%s", str);
                     ^