Cod sursa(job #465726)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 25 iunie 2010 12:35:59
Problema Ratphu Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 2.98 kb
#include<cstdio>
#include<string.h>
using namespace std;

int a[20],v[20];
int st[20];
char sir[22];
long long rez,contor;
int n,nr;

long long fact (int n)
{
    long long rezult=1;
    for (int i=2; i<=n; i++)
        rezult*=i;
    if (n==0) return 1;
    return rezult;
}

int succesor(int k)
{
    if (st[k]<n)
    {
        st[k]++;
        return 1;
    }
    return 0;
}

int valid (int k)
{
    int i;
    for (i=1; i<k; i++)
        if (st[i]==st[k]) return 0;
    return 1;
}

int solutie (int k)
{
    if (k==n) return 1;
    return 0;
}

void back (int k)
{
    st[k]=0;
    while (succesor(k))
    {
        if (valid(k))
            if (solutie(k))
            {
                long long numar=0;
                for (int i=1; i<=n; i++)
                    numar=numar*10+v[st[i]];
                if (numar%nr==0) contor++;
            }
        else if (k<=n) back(k+1);
    }
}
int main ()
{
    int ka1,ka2,ok,i,cont,sum_cif;
    freopen("ratphu.in","r",stdin);
    freopen("ratphu.out","w",stdout);
    scanf("%s",&sir);
    ok=0; ka1=0; ka2=0;
    for (i=0; i<strlen(sir); i++)
    {
        if (sir[i]==' ') ok=1;
        else if (ok==0)
            v[++ka1]=int(sir[i])-'0';
    }
    scanf("%d",&nr);
    n=ka1;
    if (nr==2)
    {
        cont=0;
        for (i=1; i<=n; i++)
            if (v[i]%2==0) cont++;
        rez=fact(n-1)*cont;
        printf("%I64d",rez);
    }
    else if (nr==3)
    {
        sum_cif=0;
        for (i=1; i<=n; i++)
            sum_cif+=v[i];
        if (sum_cif%3==0)
        {
            rez=fact(n);
            printf("%I64d",rez);
        }
        else printf("0");
    }
    else if (nr==6)
    {
        sum_cif=0;
        for (i=1; i<=n; i++)
            sum_cif+=v[i];
        cont=0;
        for (i=1; i<=n; i++)
            if (v[i]%2==0) cont++;
        if (sum_cif%3==0)
        {
            rez=fact(n-1)*cont;
            printf("%I64d",rez);
        }
        else printf("0");
    }
    else if (nr==9)
    {
        sum_cif=0;
        for (i=1; i<=n; i++)
            sum_cif+=v[i];
        if (sum_cif%9==0)
        {
            rez=fact(n);
            printf("%I64d",rez);
        }
        else printf("0");
    }
    else if (nr==5)
    {
        cont=0;
        for (i=1; i<=n; i++)
            if (v[i]%5==0) cont++;
        rez=fact(n-1)*cont;
        printf("%I64d",rez);
    }
    else if (nr==15)
    {
        sum_cif=0;
        for (i=1; i<=n; i++)
            sum_cif+=v[i];
        if (sum_cif%3==0)
        {
            cont=0;
            for (i=1; i<=n; i++)
                if (v[i]%5==0) cont++;
            rez=fact(n-1)*cont;
            printf("%I64d",rez);
        }
        else printf("0");
    }
    else if (nr==1)
    {
        rez=fact(n);
        printf("%I64d",rez);
    }
    else
    {
        contor=0;
        back(1);
        printf("%I64d",contor);
    }
    return 0;
}