Cod sursa(job #484521)

Utilizator ProtomanAndrei Purice Protoman Data 14 septembrie 2010 18:03:56
Problema Ratphu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <algorithm>
#include <stdio.h>

#define MAX 1 << 18
#define ll long long

using namespace std;

ll n;
int p, cf;
int rest[32], cifra[32], biti[32];
ll sol[MAX][20];

int main()
{
	freopen("ratphu.in", "r", stdin);
	freopen("ratphu.out", "w", stdout);
	
	scanf("%lld %d", &n, &p);

	rest[0] = 1;
	for (int i = 1; i <= 20; i++)
		rest[i] = (rest[i - 1] * 10) % p;
	
	for (cf = 0; n; n /= 10)
		cifra[cf++] = n % 10;
	
	sol[0][0] = 1;
	for (int i = 0; i < (1 << cf); i++)
	{
		biti[i] = biti[i / 2] + (i & 1);
		for (int j = 0; j < cf; j++)
			if (!(i & (1 << j)))
			{
				int ad = (cifra[j] * rest[biti[i]]) % p;

				for (int r = 0; r < p; r++)
					sol[i | (1 << j)][(r + ad >= p)? r + ad - p : r + ad] += sol[i][r];
			}
	}

	printf("%lld\n", sol[(1 << cf) - 1][0]);

	fclose(stdin);
	fclose(stdout);
	return 0;
}