Cod sursa(job #2031912)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 3 octombrie 2017 23:49:04
Problema Ratphu Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("ratphu.in");
ofstream g ("ratphu.out");
int k,v[33],p[33],mod;
long long p10[33],n,sol;
bool check()
{
    long long usu=0;
    for(int i=1;i<=k;++i) usu=usu+v[p[i]]*p10[i];
    if(usu%mod==0) return true;
    return false;
}
void solve()
{
    while(next_permutation(p+1,p+k+1))
    {
        if(check()==true) ++sol;
    }
}
long long factorial(int k)
{
    long long sol=1;
    for(int i=2;i<=k;++i) sol=sol*(1ll*i);
    return sol;
}
void solve1()
{
    while(n)
    {
        ++k;
        n/=10;
    }
    g<<factorial(k);
}
void solve2()
{
    int par=0;
    long long noroc;
    while(n)
    {
        if(n%2==0) ++par;
        n/=10;
        ++k;
    }
    noroc=factorial(k);
    noroc=noroc/k*par;
    g<<noroc;
}
void solve3()
{
    while(n)
    {
        ++k;
        n/=10;
    }
    if(n%3==0) g<<factorial(k);
    else g<<0;
}
void solve5()
{
    int n5=0;
    long long noroc;
    while(n)
    {
        if(n%5==0) ++n5;
        n/=10;
        ++k;
    }
    noroc=factorial(k);
    noroc=noroc/k*n5;
    g<<noroc;
}
void solve6()
{
    int par=0;
    long long noroc;
    if(n%3!=0)
    {
        g<<0;
        return;
    }
    while(n)
    {
        if(n%2==0) ++par;
        n/=10;
        ++k;
    }
    noroc=factorial(k);
    noroc=noroc/k*par;
    g<<noroc;
}
void solve9()
{
    while(n)
    {
        ++k;
        n/=10;
    }
    if(n%9==0) g<<factorial(k);
    else g<<0;
}
void solve10()
{
    int zero=0;
    long long noroc;
    while(n)
    {
        if(n%10==0) ++zero;
        ++k;
        n/=10;
    }
    noroc=factorial(k);
    noroc=noroc/k*zero;
}
void solve15()
{
    int n5=0;
    long long noroc;
    if(n%3!=0)
    {
        g<<0;
        return;
    }
    while(n)
    {
        if(n%5) ++n5;
        n/=10;
        ++k;
    }
    noroc=factorial(k)/k*n5;
    g<<noroc;
}
int main()
{
    f>>n>>mod;
    if(mod==1)
    {
        solve1();
        return 0;
    }
    if(mod==2)
    {
        solve2();
        return 0;
    }
    if(mod==3)
    {
        solve3();
        return 0;
    }
    if(mod==5)
    {
        solve5();
        return 0;
    }
    if(mod==6)
    {
        solve6();
        return 0;
    }
    if(mod==9)
    {
        solve9();
        return 0;
    }
    if(mod==10)
    {
        solve10();
        return 0;
    }
    if(mod==15)
    {
        solve15();
        return 0;
    }
    p10[1]=1;
    for(int i=2;i<=17;++i)
    {
        p10[i]=p10[i-1]*10;
    }
    while(n)
    {
        v[++k]=n%10;
        n/=10;
        p[k]=k;
    }
    if(check()) ++sol;
    solve();
    g<<sol;
    return 0;
}