Cod sursa(job #465730)

Utilizator deneoAdrian Craciun deneo Data 25 iunie 2010 12:38:52
Problema Ratphu Scor 40
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.59 kb
#include<fstream>
#include<algorithm>
using namespace std;
int v[20], v2[20], n=0;
inline long long giveN(){long long nr=0; for(int i=0; i<n; ++i) nr=nr*10+v[v2[i]]; return nr; } // se mai pot face optimizari pt. diferite valori al lui p
inline long long fact(int f){long long fact=1; for(int i=1; i<=f; ++i) fact*=i; return fact; }
int main()
{
	long long aux, p, nr=0, sumcif=0, cif2=0, cif0=0, cif5=0;
	ifstream f("ratphu.in");
	f>>aux>>p;
	while(aux)
	{
		v[n]=aux%10;
		sumcif+=v[n];
		if(v[n]%2==0)
			++cif2;
		if(v[n]==0)
			++cif0;
		if(v[n]==5)
			++cif5;
		v2[n]=n;
		aux/=10;
		++n;
	}
	ofstream g("ratphu.out");
	if(p==1)
	{
		g<<fact(n);
		g.close();
		return 0;
	}
	if(p==2)
	{
		g<<cif2*fact(n-1);
		g.close();
		return 0;
	}
	if(p==3)
	{
		if(sumcif%3==0)
			g<<fact(n);
		else
			g<<0;
		g.close();
		return 0;
	}
	if(p==5)
	{
		g<<fact(n-1)*(cif5+cif0);
		g.close();
		return 0;
	}
	if(p==6)
	{
		if(sumcif%3==0)
			g<<cif2*fact(n-1);
		else
			g<<0;
		g.close();
		return 0;
	}
	if(p==9)
	{
		if(sumcif%9==0)
			g<<fact(n);
		else
			g<<0;
	}
	if(p==10)
	{
		g<<fact(n-1)*cif0;
		g.close();
		return 0;
	}
	if(p==12)
	{
		if(sumcif%3!=0)
		{
			g<<0;
			g.close();
			return 0;
		}
	}
	if(p==15)
	{
		if(sumcif%3==0)
			g<<fact(n-1)*(cif0+cif5);
		else
			g<<0;
		g.close();
		return 0;
	}
	if(p==18)
	{
		if(sumcif%9==0)
			g<<fact(n-1)*cif2;
		else
			g<<0;
		return 0;
	}
	sort(v, v+n);
	do{
		if(giveN()%p==0)
			++nr;
	}while(next_permutation(v2, v2+n));
	g<<nr;
	g.close();
	return 0;
}