Submission #5401917
Source Code Expand
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) typedef long long int lli; typedef pair<int, int> P; // dp[i][j][k] // 左から i 桁(1<=i<=n.length)までの和を D で割った余がj になる個数 // ただし、N よりも大きいとダメなので、Nよりも大きい可能性があるケースは別で処理する lli dp[10002][100][2]; lli mod = 1000000007; int main() { bool safe = true; int d; string n; cin >> d >> n; lli ans = 0; dp[0][0][0] = 1; for(int i=1; i<=n.length();i++) { for (int j=0; j < d; j++) { int num = static_cast<int>(n[i-1] - '0'); // danger for (int k=0; k < num; k++) { dp[i][(j+k)%d][safe] = (dp[i][(j+k)%d][safe] + dp[i-1][j][!safe]) % mod; } dp[i][(j+num)%d][!safe] = (dp[i][(j+num)%d][!safe] + dp[i-1][j][!safe]) % mod; // safe for (int k=0; k < 10; k++) { dp[i][(j+k)%d][safe] = (dp[i][(j+k)%d][safe] + dp[i-1][j][safe]) % mod; } } } //for(int i=0; i<=n.length();i++) { // for (int j=0; j < d; j++) { // cout << "dp[" << i << "]"<< "[" << j << "][0]: " << dp[i][j][0] << endl; // } //} //cout << endl; //for(int i=0; i<=n.length();i++) { // for (int j=0; j < d; j++) { // cout << "dp[" << i << "]"<< "[" << j << "][1]: " << dp[i][j][1] << endl; // } //} cout << (dp[n.length()][0][0] + dp[n.length()][0][1] - 1) % mod << endl; }
Submission Info
Submission Time | |
---|---|
Task | E - 数 |
User | longtime |
Language | C++14 (GCC 5.4.1) |
Score | 4 |
Code Size | 1618 Byte |
Status | AC |
Exec Time | 235 ms |
Memory | 15872 KB |
Judge Result
Set Name | All | ||
---|---|---|---|
Score / Max Score | 4 / 4 | ||
Status |
|
Set Name | Test Cases |
---|---|
All | 00, 01, 02, 90, 91 |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
00 | AC | 4 ms | 384 KB |
01 | AC | 143 ms | 15872 KB |
02 | AC | 235 ms | 15744 KB |
90 | AC | 1 ms | 256 KB |
91 | AC | 1 ms | 256 KB |