Cod sursa(job #1806115)

Utilizator Emil64Emil Centiu Emil64 Data 14 noiembrie 2016 20:39:26
Problema Ratphu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string.h>

using namespace std;

char nr[262145]={0}, cifre[262145]={0};
long long int d[262145][21]={0};
bool folosit[262145]={false};
bool folosit2[262145]={false};
queue<int> q;

int main(){


    int i, j, p, t, lg, i2, c, h;

    ifstream f("ratphu.in");
    ofstream g("ratphu.out");

    f>>nr>>p;
    lg = strlen(nr);

    for(i=0; i<lg; i++){

        i2 = 1<<i;
        cifre[i2] = nr[i] - '0';
        d[i2][cifre[i2]%p] = 1;

        for(j=0; j<lg; j++){
            if(j!=i && !folosit[i2|(1<<j)]){

                folosit[i2|(1<<j)] = true;
                q.push(i2|(1<<j));
            }
        }
    }

    //memset(folosit, false, sizeof(folosit));

    while(!q.empty()){

        h = q.front();
        q.pop();
        t = h;
        if(!folosit2[h]){

            folosit2[h] = true;
            //cout << h <<" ";
            while(t){
                c = t&(-t);
                if(h&c){
                    for(j=0; j<p; j++)
                        d[h][(j*10 + cifre[c])%p]+=d[h^c][j];
                }
                t &= (t-1);
            }
            //cout << h<< "\n";
            for(i=0; i<lg; i++){

                i2 = 1<<i;

                if(!folosit[h|i2]){
                    folosit[h|i2] = true;
                    q.push(h|i2);
                }
            }

        }


    }
    /*for(i=0; i<1<<lg; i++){
        for(j=0; j<p; j++)
            cout<<d[i][j]<<" ";
        cout<<"\n";
    }*/
    g<<d[(1<<lg)-1][0]<<"\n";
}