Cod sursa(job #487017)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 23 septembrie 2010 16:20:48
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<iostream>
#include<fstream>
using namespace std;

const int mod=9967;
int v1[1000],v2[1000],v3[1000];

void precalc(int d)
{
	for(int i=0;i<=25;i++)
		v1[i%d]++;
}

void solve(int n,int d)
{
	if(n==1)
	{
		for(int i=0;i<d;i++)
			v2[i]=v1[i];
		return;
	}
	solve(n/2,d);
	memset(v3,0,sizeof(v3));
	for(int i=0;i<d;i++)
	{
		for(int j=0;j<d;j++)
		{
			if(i-j>=0)
				v3[i]+=v2[j]*v2[i-j];
			else
				v3[i]+=v2[j]*v2[i-j+d];
			v3[i]%=mod;
		}
	}
	if(n&1)
	{
		for(int i=0;i<d;i++)
		{
			v2[i]=v3[i];
			v3[i]=0;
		}	
		for(int i=0;i<d;i++)
		{
			for(int j=0;j<d;j++)
			{
				if(i-j>=0)
					v3[i]+=v2[j]*v1[i-j];
				else
					v3[i]+=v2[j]*v1[i-j+d];
				v3[i]%=mod;
			}
		}
	}
	for(int i=0;i<d;i++)
		v2[i]=v3[i];
}

int main()
{
	ifstream in("cuvinte2.in");
	ofstream out("cuvinte2.out");

	int n,d;
	in>>n>>d;
	in.close();
	precalc(d);
	solve(n,d);
	out<<v2[0]<<endl;
	out.close();
}