Pagini recente » Cod sursa (job #526718) | Cod sursa (job #941796) | Cod sursa (job #361799) | Cod sursa (job #1539755) | Cod sursa (job #2025089)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream cin("raphtu.in");
ofstream cout("raphtu.out");
const int MAX = (1 << 18) + 17;
void solve(int masca, int rest, int step, int p, int nr_cif,
vector < vector < int > > &dp, vector < int > &cif) {
if (step > nr_cif) {
return;
}
for (int i = 0; i <= nr_cif; i ++) {
int bit = 1 << i;
if ((masca & bit)) continue;
dp[masca ^ bit][(rest * 10 + cif[i]) % p] += dp[masca][rest];
solve(masca ^ bit, (rest * 10 + cif[i]) % p, step + 1, p, nr_cif, dp, cif);
if ((masca ^ bit) == (1 << nr_cif + 1) - 1) return;
dp[masca ^ bit][(rest * 10 + cif[i]) % p] = 0;
}
}
int main() {
long long n;
int p;
cin >> n >> p;
vector < int > cif(20);
int cnt = -1;
while (n) {
cif[++ cnt] = n % 10ll;
n /= 10ll;
}
long long sol = 0ll;
vector < vector < int > > dp(MAX, vector < int > (23));
dp[0][0] = 1;
solve(0, 0, 0, p, cnt, dp, cif);
int index = 1 << cnt + 1;
index -= 1;
cout << dp[index][0];
}