Cod sursa(job #2181842)

Utilizator tanasaradutanasaradu tanasaradu Data 21 martie 2018 21:18:11
Problema Ratphu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#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 , R[205];
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()
{
    for(int i = 0 ; i <= 200 ; i++)
        R[i] = i % P;
    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))][R[(j * 10 + cif[it])]] += dp[i][j];
    fout << dp[valmax][0] << "\n";
}
int main()
{
    READ();
    BUILD();
    DP();
    fin.close();
    fout.close();
    return 0;
}