Cod sursa(job #1534487)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 23 noiembrie 2015 19:14:21
Problema Lista lui Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
// O(sigma ^ 3 * log(n))

#include <fstream>
#include <array>
#include <numeric>
using namespace std;

constexpr long long mod = 104659;
constexpr int sigma = 26;

using mat = array<array<int, sigma>, sigma>;

mat mult(const mat& a, const mat& b){
	mat rez = {}, tr = {};
	for(int i = 0;  i < sigma; ++i){
		for(int j = 0; j < sigma; ++j){
			tr[i][j] = b[j][i]; } }
	for(int i = 0; i < sigma; ++i){
		for(int j = 0; j < sigma; ++j){
			long long tmp = 0;
			for(int k = 0; k < sigma; ++k){
				tmp += (long long)a[i][k] * (long long)tr[j][k]; }
			rez[i][j] = tmp%mod; } }
	return rez; }

mat exponent(mat baza, int x){
	mat rez = {};
	for(int i = 0; i < sigma; ++i){
		rez[i][i] = 1; }
	for( ; x > 0; x /= 2, baza = mult(baza, baza)){
		if(x%2 == 1){
			rez = mult(baza, rez); } }
	return rez; }

int main(){
	ifstream f("nrcuv.in");
	ofstream g("nrcuv.out");

	int n, m;
	f >> n >> m;

	mat graf;
	for(int i = 0; i < sigma; ++i){
		for(int j = 0; j < sigma; ++j){
			graf[i][j] = 1; } }

	for(int i = 0; i < m; ++i){
		char a, b;
		f >> a >> b;
		a -= 'a', b -= 'a';
		graf[a][b] = graf[b][a] = 0; }

	const auto mat_rez = exponent(graf, n-1);
	long long rez = 0;
	for(int i = 0; i < sigma; ++i){
		for(int j = 0; j < sigma; ++j){
			rez += (long long)mat_rez[i][j]; } }

	g << (rez%mod);

	return 0; }