Cod sursa(job #497513)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 2 noiembrie 2010 18:25:42
Problema Ratphu Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#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 15: if(sumac%3==0) nr=(n5+n0)*fact(nrc-1);break;
case 18: if(sumac%9==0) nr=pare*fact(nrc-1);break;
case 20: nr=n0*(pare-1)*fact(nrc-2);
}
printf("%lld",nr);
return 0;
}