Cod sursa(job #465857)

Utilizator Marius96Marius Gavrilescu Marius96 Data 25 iunie 2010 13:38:01
Problema Ratphu Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 4.11 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long unsigned fact(int x){
    if(x==1)
        return 1;
    return x*fact(x-1);
}
class fooler{//designed to fool next_permutation
public:
    int f;
    int x;
};
bool fool(fooler f1,fooler f2){
    if(f1.x==f2.x)
        return f1.f<f2.f;
    else
        return f1.x<f2.x;
}
int main(){
    freopen("ratphu.in","r",stdin);
    freopen("ratphu.out","r",stdout);
    unsigned long long n,nn;int p,ll=0;
    int v[18];
    scanf("%llu%d",&n,&p);
    nn=n;
    while(nn>0){
        v[ll++]=nn%10;
        nn/=10;
    }
    long long unsigned ans=0,ct;
    if(ll<5){
        int nr=0;
        fooler v2[18];
        for(int i=0;i<ll;i++){
            v2[i].f=nr++;v2[i].x=v[i];
        }
        sort(v2,v2+ll,fool);
        do{
            n=0;
            for(int i=0;i<ll;i++)
                n=n*10+v2[i].x;
            if(n%p==0)
                ans++;
        }while(next_permutation(v2,v2+ll,fool));
    }
    else
    switch(p){
        case 1:
            ans=fact(ll);
            break;
        case 18:
            if(n%9)
                break;
        case 6:
            if(n%3)
                break;
        case 2:
            ct=fact(ll-1);
            for(int i=0;i<ll;i++)
                if(v[i]%2==0)
                    ans+=ct;
            break;
        case 12:
            if(n%3)
                break;
        case 4:
            ct=fact(ll-2);
            for(int i=0;i<ll-1;i++)
                for(int j=i+1;j<ll;j++){
                    if((v[i]*10+v[j])%4==0)ans+=ct;
                    if((v[j]*10+v[i])%4==0)ans+=ct;
                }
            break;
        case 8:
            ct=fact(ll-3);
            for(int i=0;i<ll-2;i++)
                for(int j=i+1;j<ll-1;j++)
                    for(int k=j+1;k<ll;k++){
                        if((v[i]*100+v[j]*10+v[k])%8==0)ans+=ct;
                        if((v[i]*100+v[k]*10+v[j])%8==0)ans+=ct;
                        if((v[j]*100+v[i]*10+v[k])%8==0)ans+=ct;
                        if((v[j]*100+v[k]*10+v[i])%8==0)ans+=ct;
                        if((v[k]*100+v[i]*10+v[j])%8==0)ans+=ct;
                        if((v[k]*100+v[j]*10+v[i])%8==0)ans+=ct;
                    }
            break;
        case 16:
            ct=fact(ll-4);
            for(int i=0;i<ll-2;i++)
                for(int j=i+1;j<ll-1;j++)
                    for(int k=j+1;k<ll;k++)
                        for(int l=0;l<ll;l++){
                            if((v[i]*1000+v[j]*100+v[k]*10+v[l])%16==0)ans+=ct;
                            if((v[i]*1000+v[k]*100+v[j]*10+v[l])%16==0)ans+=ct;
                            if((v[j]*1000+v[i]*100+v[k]*10+v[l])%16==0)ans+=ct;
                            if((v[j]*1000+v[k]*100+v[i]*10+v[l])%16==0)ans+=ct;
                            if((v[k]*1000+v[i]*100+v[j]*10+v[l])%16==0)ans+=ct;
                            if((v[k]*1000+v[j]*100+v[i]*10+v[l])%16==0)ans+=ct;
                        }
            break;
        case 3:
        case 9:
            if(n%p==0)
                ans=fact(ll);
            break;
        case 15:
            if(n%3)
                break;
        case 5:
            ct=fact(ll-1);
            for(int i=0;i<ll;i++)
                if(v[i]%5==0)
                    ans+=ct;
            break;
        case 10:
            ct=fact(ll-1);
            for(int i=0;i<ll;i++)
                if(v[i]==0)
                    ans+=ct;
            break;
        case 20:
            ct=fact(ll-2);
            for(int i=0;i<ll-1;i++)
                for(int j=i+1;j<ll;j++){
                    if((v[i]*10+v[j])%20==0)ans+=ct;
                    if((v[j]*10+v[i])%20==0)ans+=ct;
                }
            break;
        default:
            int nr=0;
            fooler v2[18];
            for(int i=0;i<ll;i++){
                v2[i].f=nr++;v2[i].x=v[i];
            }
            sort(v2,v2+ll,fool);
            do{
                n=0;
                for(int i=0;i<ll;i++)
                    n=n*10+v2[i].x;
                if(n%p==0)
                    ans++;
            }while(next_permutation(v2,v2+ll,fool));

    }
    printf("%llu",ans);
    return 0;
}