Cod sursa(job #761984)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 28 iunie 2012 10:45:42
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
using namespace std;
int n,D,sol;

void Rezolvare1()
{
	int i,x,p=0,lim=n/2;
	for(i=1;i<=lim;i++)
	{
		x=n-i+1;
		while(x%D==0)
		{
			p++;
			x/=D;
		}
		x=i;
		while(x%D==0)
		{
			p--;
			x/=D;
		}
		//trebuie ca D sa apara la o putere > 0
		if(p>0)
		{
			sol+=2;
			if(2*i==n)
				sol--;
		}
	}
}

void Rezolvare2()
{
	int i,x,p=0,lim=n/2;
	for(i=1;i<=lim;i++)
	{
		x=n-i+1;
		while(x%2==0)
		{
			p++;
			x/=2;
		}
		x=i;
		while(x%2==0)
		{
			p--;
			x/=2;
		}
		//trebuie ca sa 2 sa apara la o putere > 1
		if(p>1) 
		{
			sol+=2;
			if(2*i==n)
				sol--;
		}
	}
}

void Rezolvare3()
{
	int i,x,p2=0,p3=0,lim=n/2;
	for(i=1;i<=lim;i++)
	{
		x=n-i+1;
		while(x%2==0)
		{
			p2++;
			x/=2;
		}
		while(x%3==0)
		{
			p3++;
			x/=3;
		}
		x=i;
		while(x%2==0)
		{
			p2--;
			x/=2;
		}
		while(x%3==0)
		{
			p3--;
			x/=3;
		}
		//trebuie ca sa 2 si 3 sa apara la o putere > 0
		if(p2>0 && p3>0)
		{
			sol+=2;
			if(2*i==n)
				sol--;
		}
	}
}

int main()
{
	ifstream fin("pascal.in");
	fin>>n>>D;
	fin.close();
	
	if(D==2 || D==3 || D==5)
		Rezolvare1();
	if(D==4)
		Rezolvare2();
	if(D==6)
		Rezolvare3();
	ofstream fout("pascal.out");
	fout<<sol<<"\n";
	fout.close();
	return 0;
}