Pagini recente » Cod sursa (job #3284866) | Cod sursa (job #1284149) | Cod sursa (job #473117) | Cod sursa (job #1149285) | Cod sursa (job #465857)
Cod sursa(job #465857)
#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;
}