Algorithm


Problem Name: 2 AD-HOC - beecrowd | 2439

Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2439

Cachecol da Vovó Vitória

 

Por OBI - Olimpíada Brasileira de Informática 2013 BR Brazil

Timelimit: 1

Vovó Vitória possui muitos netinhos; como toda boa avó, ela se preocupa constantemente com a saúde de seus netos, e quer garantir que eles estejam sempre bem agasalhados o tempo todo.

Vovó Vitória dispõe de um saco com vários retalhos quadrados de mesmo tamanho, em três cores diferentes, e quer usá-los para costurar cachecóis para seus netos. Ela quer que cada cachecol tenha três retalhos de largura por N de comprimento e, além disso, retalhos adjacentes devem ter cores diferentes. Por exemplo, a figura abaixo mostra três cachecóis que Vovó Vitória pode costurar.

 

Entrada

 

A entrada consiste de uma única linha contendo um único inteiro N(1 ≤ N ≤ 1018), indicando o número de retalhos no comprimento do cachecol.

 

Saída

 

Imprima uma única linha contendo um único número inteiro, indicando o número de cachecóis distintos que a Vovó Vitória pode costurar. Como este número pode ser muito grande, imprima o resto que este número deixa quando dividido por 1.000.000.007 (109 + 7).

 

 

 

Exemplos de Entrada Exemplos de Saída

1

12

 

Code Examples

#1 Code Example with C++ Programming

Code - C++ Programming


#include <algorithm>
#include <cstdio>
#define REP(A, B) for (long long A = 0; A  <  B; A++)
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
const ll MAXK = 2;
typedef struct matrix {
    ll mat[MAXK][MAXK];
} matrix;
matrix base, identidade;
matrix multiplication(matrix A, matrix B) {
    matrix C;
    REP(i, MAXK) REP(j, MAXK) C.mat[i][j] = 0;
    REP(i, MAXK)
    REP(j, MAXK)
    REP(k, MAXK) C.mat[i][j] = (C.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % MOD;
    return C;
}
matrix exponentiation(ll expo) {
    if (expo == 0) return identidade;
    if (expo == 1) return base;
    if (expo % 2 == 0) {
        matrix temp = exponentiation(expo / 2);
        return multiplication(temp, temp);
    }
    return multiplication(base, exponentiation(expo - 1));
}
int main() {
    ll n;
    scanf("%lld", &n);
    if (n == 1) {
        printf("12\n");
        return 0;
    }
    if (n == 2) {
        printf("54\n");
        return 0;
    }
    REP(i, MAXK) REP(j, MAXK) identidade.mat[i][j] = (i == j);
    base.mat[0][0] = 0;
    base.mat[0][1] = 1;
    base.mat[1][0] = -2;
    base.mat[1][1] = 5;
    matrix t = exponentiation(n - 1);
    ll resp = (t.mat[0][0] * 12 + t.mat[0][1] * 54) % MOD;
    resp = (resp + MOD) % MOD;
    printf("%lld\n", resp);
    return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
1

Output

x
+
cmd
12
Advertisements

Demonstration


Previous
#2438 Beecrowd Online Judge Solution 2438 Quadradinho de 8 Solution in C, C++, Java, Js and Python
Next
#2441 Beecrowd Online Judge Solution 2441 Janela Solution in C, C++, Java, Js and Python