Cod sursa(job #3136092)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 5 iunie 2023 13:44:47
Problema 12-Perm Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
//Ilie Dumitru
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
const int NMAX=1505;
const int MOD=(1<<20)-1;
const int DIM=6;

struct mat
{
	long long int v[DIM][DIM];
};

mat I, A, X;

/*
101000
001010
000000
010000
101110
010001
*/

void init()
{
	int i, j;
	const int N=11;
	const int pi[N]={0, 0, 1, 1, 3, 4, 4, 4, 4, 5, 5};
	const int pj[N]={0, 2, 2, 4, 1, 0, 2, 3, 4, 1, 5};

	for(i=0;i<DIM;++i)
		for(j=0;j<DIM;++j)
			I.v[i][j]=(i==j), A.v[i][j]=X.v[i][j]=0;

	for(i=0;i<N;++i)
		A.v[pi[i]][pj[i]]=1;

	X.v[2][0]=2;
}

void mult(mat& ans, mat& a, mat& b)
{
	int i, j, k;

	for(i=0;i<DIM;++i)
		for(j=0;j<DIM;++j)
			for(k=ans.v[i][j]=0;k<DIM;++k)
				ans.v[i][j]=(ans.v[i][j]+a.v[i][k]*b.v[k][j])&MOD;
}

void fastExp(mat& ans, int p)
{
	if(p==0)
		ans=I;
	else if(p==1)
		ans=A;
	else
	{
		if(p&1)
		{
			mat aux, aux1;
			fastExp(aux, p>>1);
			mult(aux1, aux, aux);
			mult(ans, aux1, A);
		}
		else
		{
			mat aux;
			fastExp(aux, p>>1);
			mult(ans, aux, aux);
		}
	}
}

int getAns(mat& M)
{
	mult(I, M, X);
	return (I.v[0][0]+I.v[1][0]+I.v[2][0]+I.v[3][0]+I.v[4][0]+I.v[5][0])&MOD;
}

int main()
{
	FILE* f=fopen("12perm.in", "r"), *g=fopen("12perm.out", "w");
	int N;
	mat M;

	fscanf(f, "%d", &N);
	if(N==1)
		fprintf(g, "1\n");
	else
	{
		init();
		fastExp(M, N-2);
		fprintf(g, "%d\n", getAns(M));
	}

	fclose(f);
	fclose(g);
	return 0;
}