Cod sursa(job #638630)

Utilizator S7012MYPetru Trimbitas S7012MY Data 21 noiembrie 2011 10:13:04
Problema Ciuperci Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define MOD 666013
#define LL long long
using namespace std;


//N impar F(N) = F((N-1)/2)^2
//N par F(N) = 2 * (F(N/2-1) * F(N/2))

typedef pair<LL, LL> per;

per f(LL a, LL b) {
	if(a==1) return make_pair(1,1);
	per r=f(a/2,b/2),t;
	if(b&1) {
		t.first=r.first*r.first;
		t.second=2LL*r.first*r.second;
	}else {
		t.first=r.second*r.second;
		t.second=2LL*r.first*r.second;
	}
	return t;
}

LL fi(LL n) {
	if(n==1 || n==0) return 1;
	if(n==2) return 2;
	if(n&1) {
		LL r=fi(n/2);
		r*=r;
		return r;
	}else {
		per r=f(n/2-1,n/2);
		return 2*r.first*r.second;
	}
}

int main()
{
	ifstream f("ciuperci.in");
	ofstream g("ciuperci.out");
	int q;
	LL n;
	for(f>>q;q--;) {
		f>>n;
		g<<fi(n)<<'\n';
		cout<<fi(n)<<'\n';
	}
	return 0;
}