Pagini recente » Cod sursa (job #387554) | Cod sursa (job #562845) | Cod sursa (job #1595933) | Cod sursa (job #3267883) | Cod sursa (job #2181830)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("ratphu.in");
ofstream fout ("ratphu.out");
const short NMAX = 18;
const short PMAX = 20;
long long dp[(1 << NMAX) + 1][PMAX];
int n , P , cif[NMAX] , valmax;
string s;
vector < int > L[(1 << NMAX) + 1];
/**
dp[i][j] - > numarul de moduri de a permuta numerele care au bitul
1 in starea binara al lui i , numerele avand suma modulo P = j
*/
inline void READ()
{
fin >> s >> P;
n = s . size();
for(int i = 0 ; i < n ; i++)
cif[i] = (s[i] - '0');
}
inline void BUILD()
{
valmax = (1 << n) - 1;
for(int i = 0 ; i <= valmax ; i++)
for(int j = 0 ; j < n ; j++)
if((i & (1 << j)) == 0)
L[i] . push_back(j);
}
inline void DP()
{
dp[0][0] = 1;
for(int i = 0 ; i <= valmax ; i++)
for(int j = 0 ; j < P ; j++)
for(auto it : L[i])
dp[(i | (1 << it))][(j * 10 + cif[it]) % P] += dp[i][j];
fout << dp[valmax][0] << "\n";
}
int main()
{
READ();
BUILD();
DP();
fin.close();
fout.close();
return 0;
}