Cod sursa(job #465795)

Utilizator tranbachhaiTran Bach Hai tranbachhai Data 25 iunie 2010 13:12:06
Problema Ratphu Scor 30
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.08 kb
#include<stdio.h>
#include<string.h>
#include<math.h>
#define prim 10000 

char s[1000];
int x[1000],p,nr,m,frec[20];

void adun(int val)
{
int t=0,i;
	x[1]=x[1]+val;
	for (i=1;i<=x[0]&&t;++i)
		{
			t=(x[i]+t)/prim;
			x[i]=(x[i]+t)%prim;
		}
	if (t!=0)
		x[++x[0]]=t;
}

void inm(int val)
{
int t=0,i;
	for (i=1;i<=x[0];++i)
		{
			t=(x[i]*val+t)/prim;
			x[i]=(x[i]*val+t)%prim;
		}
	if (t!=0)
		x[++x[0]]=t;
}

void back(int rest,int cif)
	{
	int i;
		if (cif==m)
		{
			if (rest==0)
			adun(1);	
			return;
		}
		for (i=0;i<=9;++i)
			if (frec[i])
			{
				--frec[i];
				back((rest*10+i)%p,cif+1);
				++frec[i];
			}
	}

int main()
{
int i,j;
	freopen("ratphu.in","r",stdin);
	freopen("ratphu.out","w",stdout);
	
	gets(s+1);
	nr=strlen(s+1);
	x[++x[0]]=0;
	for (i=1;i<=nr;++i)
			if (s[i]!=' ')
				++frec[s[i]-'0'];	
			else
				break;
	m=i-1;
	for (j=i+1;j<=nr;++j)
		{
			p=p*10+(s[j]-'0');
		}
	back(0,0);
	for (i=0;i<=9;++i)
		for (j=2;j<=frec[i];++j)
			inm(j);	
for (i=x[0];i>=1;--i)
	printf("%d",x[i]);
	return 0;
}