Cod sursa(job #2475531)

Utilizator aurelionutAurel Popa aurelionut Data 17 octombrie 2019 01:22:56
Problema Ratphu Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>

using namespace std;

int n, k;
int dp[20][(1 << 18) + 5];
int mod[20];

int CntBits(int x)
{
    int cnt = 0;
    while (x > 0)
    {
        ++cnt;
        x &= (x - 1);
    }
    return cnt;
}

int main()
{
    ///complexitate cam mare, dar ca idee :)
    ifstream fin("ratphu.in");
    ofstream fout("ratphu.out");
    fin >> n >> k;
    mod[0] = 1 % k;
    for (int i = 1;i <= 18;++i)
        mod[i] = mod[i - 1] * 10 % k;
    dp[0][0] = 1;
    int cnt = 0;
    while (n > 0)
    {
        int x = n % 10;
        n /= 10;
        ++cnt;
        for (int state = 0;state < (1 << 18);++state)
        {
            int val = CntBits(state);
            if (val != cnt - 1)
                continue;
            for (int i = 0;i < 18;++i)
                if (((1 << i) & state) == 0)
                {
                    for (int j = 0;j < 20;++j)
                    {
                        int currrest = j;
                        int newrest = (j + mod[i] * x) % k;
                        dp[newrest][state | (1 << i)] += dp[currrest][state];
                    }
                }
        }
    }
    fout << dp[0][(1 << cnt) - 1] << "\n";
    fin.close();
    fout.close();
    return 0;
}