Pagini recente » Cod sursa (job #2713980) | Cod sursa (job #2353858) | Cod sursa (job #1876413) | Cod sursa (job #646247) | Cod sursa (job #2950082)
#include <cstring>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("ratphu.in");
ofstream fout("ratphu.out");
int c[20], p;
long long n, np[1 << 18][20]; // np[i][j] = numarul de posibilitati cu cifrele din masca i
// care reprezinta un numar "nr" cu restul nr % p = j
int main()
{
fin >> n >> p;
int len = 0;
while (n)
{
c[len++] = n % 10;
n /= 10;
}
reverse(c, c + len);
np[0][0] = 1; // nu luam nici o cifra => nr = 0 => nr % P == 0
for (int i = 0; i < (1 << len); ++i) // Pentru fiecare submultime cu i cifre (in masca am pozitii din c)
for (int j = 0; j < p; ++j) // Pentru fiecare numar j (modulo p)
if (np[i][j]) // obtinut cu submultimea de cifre din i
for (int k = 0; k < len; ++k) // Pentru fiecare cifra c[k]
if ((i & (1 << k)) == 0) // care nu este in submultimea i
np[i | (1 << k)][(j * 10 + c[k]) % p] += np[i][j]; // adaugam cifra c[j] la sfarsitul numarului j
fout << np[(1 << len) - 1][0];
}