Cod sursa(job #2586057)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 19 martie 2020 17:51:21
Problema Ratphu Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
//
//  main.cpp
//  ratphu
//
//  Created by Eusebiu Rares on 19/03/2020.
//  Copyright © 2020 Eusebiu Rares. All rights reserved.
//

#include <iostream>
#include "algorithm"
#include "fstream"

const int MV = 20 ;

std::fstream in ("ratphu.in", std::ios::in) ;
std::fstream out ("ratphu.out", std::ios::out) ;

int cif[MV + 1] ;
long long dp[1 << MV][MV + 1] ;

static void update(int newDigit, int p, int rest, int state) {
	if (!(state & (1 << newDigit))) {
		dp[state | (1 << newDigit)][(rest * 10 + cif[newDigit]) % p] += dp[state][rest] ;
	}
}

static void addDigit(int len, int p, int rest, int state) {
	for (int newDigit = 0 ; newDigit < len ; ++ newDigit) {
		update(newDigit, p, rest, state);
	}
}

static void modify(int len, int p, int rest, int state) {
	if (dp[state][rest]) {
		addDigit(len, p, rest, state);
	}
}

int main(int argc, const char * argv[]) {
	long long n ;
	int p ; in >> n >> p ;
	int len(0) ;
	while (n) {
		cif[len ++] = n % 10 ;
		n /= 10 ;
	}
	dp[0][0] = 1 ;
	for (int state = 0 ; state < (1 << len) ; ++ state) {
		for (int rest = 0 ; rest < p ; ++ rest) {
			modify(len, p, rest, state);
		}
	}
	out << dp[(1 << len) - 1][0] ;
}