Cod sursa(job #2950082)

Utilizator murgurazvan991Murgu Razvan Tudor murgurazvan991 Data 2 decembrie 2022 20:04:03
Problema Ratphu Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#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];
}