Cod sursa(job #467415)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 28 iunie 2010 20:45:52
Problema Ratphu Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;

#define file_in "ratphu.in"
#define file_out "ratphu.out"

#define nmax 100

int v[nmax];
int p[nmax];
int viz[nmax];
long long sol;
int P;
int nr;
char ch;
long long d[1<<18][20];



void citire()
{
    int i,l;
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    nr=0;
    while(!feof(stdin))
    {
        scanf("%c", &ch);
        if (ch==' ')
          break;
        v[++nr]=ch-'0';
    }

    scanf("%d", &P);


}

void back(int k)
{
    int i,j;
    long long x;
    if (k==nr+1)
    {
       if (P==1) sol++;
       else
       if (P==2 && v[p[nr]]%2==0) sol++;
       else
       {

       x=0;
       i=0;
       while(v[p[i]]==0) i++;
       for (j=i;j<=nr;++j)
            x=x*10+v[p[j]];
       if (x%P==0) sol++;
       }
    }

    for (i=1;i<=nr;++i)
        if (!viz[i])
        {
            viz[i]=1;
            p[k]=i;
            back(k+1);
            viz[i]=0;
        }
}

void solve()
{
    int i,j,k;
     d[0][0]=1;
     for (i=0;i<(1<<nr);++i)
          for (j=0;j<P;++j)
               if (d[i][j])
                   for (k=0;k<nr;++k)
                        if ((i&(1<<k))==0)
                        d[i|(1<<k)][(j*10+v[k])%P]+=d[i][j];
        printf("%lld\n", d[(1<<nr)-1][0]);

}

int main()
{
    citire();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;
}