Pagini recente » Cod sursa (job #678347) | Cod sursa (job #1504132) | Cod sursa (job #2428468) | Cod sursa (job #178269) | Cod sursa (job #497673)
Cod sursa(job #497673)
#include<stdio.h>
long long n,nr;
int p,nrc,v[20],s[20],sumac,xx;
long long fact(int x){
long long f=1;
int i;
for(i=1;i<=x;++i) f*=i;
return f;
}
void det_cifre(long long x){
while(x){
v[++nrc]=x%10; x/=10;
}
}
int valid(int k){
int i;
for(i=1;i<k;++i)
if(s[i]==s[k]) return 0;
return 1;
}
void scrie(){
int i;
long long nou=0;
for(i=1;i<=nrc;++i)
nou=nou*10+v[s[i]];
if(nou%7==0) ++nr;
}
void back(){
int up,k=1;
s[k]=0;
while(k){
up=0;
while(!up&&s[k]<nrc){
s[k]++;
if(valid(k)) up=1;
}
if(up)
if(k==nrc) scrie();
else s[++k]=0;
else k--;
}
}
int main(){
freopen("ratphu.in","r",stdin);
freopen("ratphu.out","w",stdout);
int pare=0,i,j,k,impare=0,n5=0,n0=0,z,nn;
scanf("%lld%d",&n,&p);
det_cifre(n);
for(i=1;i<=nrc;++i){
impare+=v[i]&1,sumac+=v[i];
n5+=v[i]==5,n0+=v[i]==0;
}
pare=nrc-impare;
switch(p){
case 1: nr=fact(nrc);break;
case 2: nr=pare*fact(nrc-1);break;
case 3: if(sumac%3==0) nr=fact(nrc);break;
case 4: k=0;
for(i=1;i<=nrc;++i)
for(j=1;j<=nrc;++j)
if(i!=j){
z=v[i]*10+v[j];
if(z%4==0) ++k;
}
nr=k*fact(nrc-2);break;
case 5: nr=(n5+n0)*fact(nrc-1); break;
case 6: if(sumac%3==0) nr=pare*fact(nrc-1);break;
case 7: back();break;
case 8: nn=0;
for(i=1;i<=nrc;++i)
for(j=1;j<=nrc;++j)
for(k=1;k<=nrc;++k)
if(i!=j&&i!=k&&j!=k){
z=v[i]*100+v[j]*10+v[k];
if(z%8==0) ++nn;
}
nr+=nn*fact(nrc-3);break;
case 9: if(sumac%9==0) nr=fact(nrc);break;
case 10: nr=n0*fact(nrc-1);break;
case 11: back();break;
case 12: if(sumac%3==0){
k=0;
for(i=1;i<=nrc;++i)
for(j=1;j<=nrc;++j)
if(i!=j){
z=v[i]*10+v[j];
if(z%4==0) ++k;
}
nr=k*fact(nrc-2);break;
}
case 13: back();break;
case 15: if(sumac%3==0) nr=(n5+n0)*fact(nrc-1);break;
case 17: back();break;
case 18: if(sumac%9==0) nr=pare*fact(nrc-1);break;
case 19: back();break;
case 20: nr=n0*(pare-1)*fact(nrc-2);
}
printf("%lld",nr);
return 0;
}