# |
Author |
Problem |
Lang |
Verdict |
Time |
Memory |
Sent |
Judged |
|
42364256 |
Practice:
bjn |
401D
- 20
|
C++14 (GCC 6-32)
|
Accepted
|
2417 ms
|
430932 KB
|
2018-09-02 16:39:38 |
2018-09-02 16:39:38 |
|
#include <bits/stdc++.h>
using namespace std;
const int MASK = (1 << 19), M = 105;
long long dp[MASK][M], n, m, num, cnt[10];
vector <int> digits;
void Save() {
long long tmp = n;
while (tmp) {
digits.push_back(tmp % 10);
cnt[tmp % 10]++;
tmp /= 10;
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
num = int(log10(n)) + 1;
Save();
dp[0][0] = 1;
for (int mask = 0; mask < (1 << num) - 1; ++mask) {
for (int rem = 0; rem < m; ++rem) {
if (__builtin_popcount(mask) == 1 && digits[__builtin_ctz(mask)] == 0) break;
for (int i = 1; i <= num; ++i) {
if ((mask & (1 << (i - 1))) != 0) {
continue;
}
dp[mask | (1 << (i - 1))][(rem * 10 + digits[i - 1]) % m] += dp[mask][rem];
}
}
}
long long res = dp[(1 << num) - 1][0];
for (int i = 0; i <= 9; ++i)
for (int j = 2; j <= cnt[i]; ++j)
res /= j;
cout << res << endl;
}
Click to see test details