Cod sursa(job #465792)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 25 iunie 2010 13:10:41
Problema Ratphu Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.53 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define FIN "ratphu.in"
#define FOUT "ratphu.out"

#define MAXC 20

int P, V[MAXC], A[MAXC];

long long R, N;

void parse(long long X)
{
    int i;

    for (i = 1; X; ++ i)    V[i] = X % 10, X /= 10;

    V[0] = i - 1;
}

long long fact(int X)
{
    int i;
    long long  A = 1;

    for (i = 1; i <= X; ++ i)   A = 1LL *  A * i;

    return A;
}

void check()
{
    int i;
    long long B = 1, A;

    for (i = V[0], A = 0; i ; -- i, B *= 10)
        A += B * V[i];

    if (A % P == 0)
        ++ R;
}

void solve()
{
    int i, j;

    parse(N);

    if (P == 2)
    {
        for (i = 1, j = 0; i <= V[0]; ++ i)
            if (V[i] % 2 == 0)
                ++ j;

        R = 1LL * j * fact(V[0] - 1);

        return;
    }

    if (P == 3)
    {
        for (i = 1, j = 0; i <= V[0]; ++ i)
            j += V[i];

        if (!(j % 3))
        {
            R = fact(V[0]);

            return;
        }
    }

    if (P == 5)
    {
        for (i = 1, j = 0; i <= V[0]; ++ i)
            if (V[i] == 5 || V[i] == 0)
                ++ j;

        R = 1LL * j * fact(V[0] - 1);

        return;
    }

    sort(V + 1, V + V[0] + 1);

    do
    {
        check();
    } while (next_permutation(V + 1, V + V[0] + 1));
}

int main()
{
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%lld\n", &N);

    scanf("%d", &P);

    solve();

    printf("%lld\n", R);
}