Cod sursa(job #3184336)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 15 decembrie 2023 14:50:13
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
// Ilie Dumitru
#include<fstream>
#include<iostream>
const int NMAX=20005;

struct big
{
	int N;
	int cifre[NMAX];

	big()
	{
		this->N=1;
		for(int i=0;i<NMAX;++i)
			this->cifre[i]=0;
	}

	friend std::istream& operator>>(std::istream& in, big& x)
	{
		in>>x.N;
		for(int i=x.N-1;i>-1;--i)
			in>>x.cifre[i];
		return in;
	}

	friend std::ostream& operator<<(std::ostream& out, const big& x)
	{
		for(int i=x.N-1;i>-1;--i)
			out<<x.cifre[i];
		return out;
	}

	// a += b
	friend void operator+=(big& a, int b)
	{
		int i, t;

		for(i=t=0;b || t;++i)
		{
			a.cifre[i]+=b%10+t;
			t=a.cifre[i]/10;
			a.cifre[i]%=10;
			b/=10;
		}

		if(i>a.N)
			a.N=i;
	}

	// a *= b
	friend void operator*=(big& a, long long int b)
	{
		if(b==0)
		{
			a=big();
			return;
		}

		int i;
		long long int t, aux;

		for(i=t=0;t || i<a.N;++i)
		{
			aux=a.cifre[i]*b+t;
			a.cifre[i]=aux%10;
			t=aux/10;
		}

		if(i>a.N)
			a.N=i;
	}

	// a += b
	friend void operator+=(big& a, const big& b)
	{
		int i, t;

		for(i=t=0;i<b.N || t;++i)
		{
			a.cifre[i]+=b.cifre[i]+t;
			t=a.cifre[i]/10;
			a.cifre[i]%=10;
		}

		if(i>a.N)
			a.N=i;
	}

	// a *= b
	friend void operator*=(big& a, const big& b)
	{
		int i, j;
		big ans;

		ans.N=a.N+b.N-1;
		for(i=0;i<a.N;++i)
			for(j=0;j<b.N;++j)
				ans.cifre[i+j]+=a.cifre[i]*b.cifre[j];

		if(ans.cifre[ans.N-1]==0)
		{
			ans.N=1;
		}
		else
		{
			for(i=j=0;i<ans.N || j;++i)
			{
				ans.cifre[i]+=j;
				j=ans.cifre[i]/10;
				ans.cifre[i]%=10;
			}

			if(i>ans.N)
				ans.N=i;
		}

		a=ans;
	}

	// a /= b and return a % b
	friend int operator/=(big& a, int b)
	{
		if(b==0)
		{
			return 0;
		}

		int i, total;

		for(i=a.N-1, total=0;i>-1;--i)
		{
			total=total*10+a.cifre[i];
			a.cifre[i]=total/b;
			total%=b;
		}

		while(a.N>1 && a.cifre[a.N-1]==0)
			--a.N;

		return total;
	}

	// a % b
	friend int operator%(const big& a, int b)
	{
		if(b==0)
		{
			return 0;
		}

		int i, total;

		for(i=a.N-1, total=0;i>-1;--i)
		{
			total=(total*10+a.cifre[i])%b;
		}

		return total;
	}
};

int main()
{
	std::ifstream f("patrate2.in");
	std::ofstream g("patrate2.out");
	big a, p2;
	int i, N;

	f>>N;

	a.cifre[0]=p2.cifre[0]=1;
	for(i=1;i<=N;++i)
	{
		a*=i;
		p2*=2;
	}

	for(i=1;i<=N;++i)
	{
		a*=p2;
	}

	g<<a;

	return 0;
}