FBRICK - Xếp hình

Tác giả: hieult

Ngôn ngữ: C++

#include<cstdio>
#include<cmath>
#include<math.h>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<sstream>
#include<list>
#define fi first
#define se second
#define PB push_back
#define MP make_pair
#define ep 0.00001
#define oo 111111111
//#define mod 1000000009
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
#define rep(i, n) for(int i = 0; i < n; i++)
#define FOR(i, a, b) for(int i = a; i <= b; i++)
#define FORD(i, a, b) for(int i = a; i >= b; i--)
#define MS(a, x) memset(a, x, sizeof(a))
#define SZ(a) (int)(a.size())
//#define g 9.81
double const PI=4*atan(1.0);

using namespace std;

typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;
typedef long long ll;
const int max_size = 4;
ll mod;

struct Matrix{
    ll x[max_size][max_size];
    Matrix(){};
    Matrix(int d){
        MS(x, 0);
        rep(i, max_size) x[i][i] = d;
    };
    Matrix(ll const a[max_size][max_size]) { for(int i = 0; i < max_size; i++) for(int j = 0; j < max_size; j++) x[i][j] = a[i][j];}
    friend Matrix operator * (const Matrix &a, const Matrix &b){
        Matrix c;
        for(int i = 0; i < max_size; i++) for(int j = 0; j < max_size; j++){
            c.x[i][j] = 0;
            for(int k = 0; k < max_size; k++) c.x[i][j] = (c.x[i][j] + a.x[i][k] * b.x[k][j]) % mod;
        } 
        return c;
    }

    friend Matrix operator ^ (const Matrix &a,const int &k){
		Matrix base;
		rep(i, max_size) rep(j, max_size) base.x[i][j] = a.x[i][j];
		Matrix res = Matrix(1);
		int p = k;
		while (p > 0) {
			if (p & 1) {
				res = res * base;
			}
			p >>= 1;
			base = base * base;
		}
		return res;
    }
    
    void print(){
        for(int i = 0; i < max_size; i++){
            for(int j = 0; j < max_size; j++) printf("%lld ",x[i][j]);
            printf("\n");
        }
    }
};

int test;
ll x, k, n, m, a[5], f[5];

int main(){
    //freopen("input.in","r",stdin); 
    //freopen("output.out","w",stdout);
    cin >> test;
    while(test --){
        cin >> x >> n >> mod;
        x %= mod;
        a[1] = 1 % mod; f[1] = a[1];
        a[2] = x ; f[2] = (a[1] * a[1] + a[2] * a[2]) %mod;
        for(int i = 3; i <= 4; i++) {
            a[i] =( 2 * x * a[i - 1] - a[i - 2]) % mod;
            f[i] = (f[i - 1] + a[i] * a[i]) % mod;
        }
        if(n < 5) cout<<f[n]<<endl;
        
        else {
            k = (4 * x * x - 1) % mod;
            ll u[4][4] = { (k + 1) % mod , 1, 0, 0,
                              mod - ((2 * k) % mod), 0, 1, 0,
                              (k + 1) % mod, 0, 0, 1,
                             mod - 1, 0, 0, 0};
            Matrix A = Matrix(u);
            A = A ^ (n - 4);
            long long kq = 0;
            for(int i = 0; i < 4; i++) kq = (kq + f[4 - i] * A.x[i][0]) % mod;
            cout << kq << endl;
        } 
    }
   // getch();
}



Download