Cod sursa(job #465647)

Utilizator mihai995mihai995 mihai995 Data 25 iunie 2010 10:56:13
Problema Ratphu Scor 40
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.03 kb
#include <fstream>
using namespace std;

short int s[1<<4],k;
long long cnt;

ifstream in("ratphu.in");
ofstream out("ratphu.out");

void bkt(long long nr,int p,int rest)
{
	if (p==s[10]+1)
	{
		if (!rest)
			cnt+=nr;
		return;
	}
	for (int i=0;i<10;i++)
		if (s[i])
		{
			s[i]--;
			bkt(nr*(s[i]+1),p+1,(rest*10+i)%k);
			s[i]++;
		}
}

long long fact(int x)
{
	long long c=1;
	for (int i=1;i<=x;i++)
		c*=i;
	return c;
}

int main()
{
	int i;
	char a[1<<5];
	in>>a>>k;
	if (k==2 || k==5)
	{
		for (i=0;a[i];i++)
			if ((a[i]-'0')%k==0)
				cnt++;
		cnt*=fact(i-1);
		out<<cnt<<"\n";
		return 0;
	}
	if (k==3 || k==9)
	{
		for (i=0;a[i];i++)
			cnt+=a[i]-'0';
		if (cnt%k==0)
			out<<fact(i)<<"\n";
		else
			out<<"0\n";
		return 0;
	}
	for (i=0;a[i];i++)
		s[a[i]-'0']++;
	s[10]=i;
	if (k==10)
	{
		out<<s[0]*fact(s[10]-1)<<"\n";
		return 0;
	}
	if (k==20)
	{
		out<<s[0]*(s[0]+s[2]+s[4]+s[6]+s[8]-1)*fact(s[10]-2)<<"\n";
		return 0;
	}
	bkt(1,1,0);
	out<<cnt<<"\n";
	return 0;
}