Submission
Status:
PPPPPPPPPPP
Score: 100
User: SnowAveNode
Problemset: สุ่มเจาะ
Language: cpp
Time: 0.002 second
Submitted On: 2025-03-20 22:38:00
#include<bits/stdc++.h>
using namespace std;
long long dp[20][11][2];
bool visited[20][11][2];
int D, B;
vector<int> digits;
long long solveDP(int pos, int last, int tight) {
if (pos == D) return 1;
if (visited[pos][last][tight]) return dp[pos][last][tight];
visited[pos][last][tight] = true;
long long ways = 0;
int limit = (tight ? digits[pos] : B - 1);
for (int x = last; x <= limit; x++) {
int newTight = (tight && (x == limit)) ? 1 : 0;
ways += solveDP(pos + 1, x, newTight);
}
dp[pos][last][tight] = ways;
return ways;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> D >> B;
string N;
cin >> N;
digits.resize(D);
for (int i = 0; i < D; i++){
digits[i] = N[i] - '0';
}
memset(visited, 0, sizeof(visited));
long long ans = solveDP(0, 0, 1);
cout << ans << "\n";
return 0;
}