Pagini recente » Cod sursa (job #2118057) | Cod sursa (job #2528988) | Cod sursa (job #3221027) | Cod sursa (job #280650) | Cod sursa (job #465705)
Cod sursa(job #465705)
#include <cstdio>
#include <cstring>
long long unsigned fact(int x){
if(x==1)
return 1;
return x*fact(x-1);
}
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;
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:
sort(v,v+ll);
do{
n=0;
for(int i=0;i<ll;i++)
n=n*10+v[i];
if(n%p==0)
ans++;
}while(next_permutation(v,v+l));
}
printf("%llu",ans);
return 0;
}