Hdu2855Fibonacci Check-up矩阵

转个图。

或者打表找的规律是  g[n] = 3*g[n-1] - g[n-2];

构造个 3 -1  的矩阵然后搞下就好了。

1  0

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string.h>
typedef long long LL;
using namespace std;

LL mod;

struct Matrix
{
    LL m[4][4];
};

Matrix Mul(Matrix a, Matrix b)
{
    Matrix ans;
    for (LL i = 0; i < 2; i++){
        for (LL j = 0; j < 2; j++){
            ans.m[i][j] = 0;
            for (LL k = 0; k < 2; k++)
                ans.m[i][j] += a.m[i][k] * b.m[k][j], ans.m[i][j] = (ans.m[i][j] + mod) % mod;
        }
    }
    return ans;
}

Matrix quick(Matrix a, LL b)
{
    Matrix ans;
    for (LL i = 0; i < 2; i++)
    for (LL j = 0; j < 2; j++)
        ans.m[i][j] = (i == j);
    Matrix c;
    c = Mul(a, a);
    while (b){
        if (b & 1) ans = Mul(a, ans);
        a = Mul(a, a);
        b >>= 1;
    }
    return ans;
}

Matrix init()
{
    Matrix ans;
    ans.m[0][0] = 3; ans.m[0][1] = -1;
    ans.m[1][0] = 1; ans.m[1][1] = 0;
    return ans;
}
int main()
{
    LL T;
    LL n;
    cin >> T;
    while (T--){
        cin >> n >> mod;
        if (n == 0){
            cout << 0 << endl; continue;
        }
        if (n == 1){
            cout << 1 << endl; continue;
        }
        Matrix ans = init();
        ans = quick(ans, n - 1);
        cout << ans.m[0][0] << endl;
    }
    return 0;
}
时间: 2024-10-07 20:38:33

Hdu2855Fibonacci Check-up矩阵的相关文章

[Scoi2015]小凸玩矩阵

bzoj 4443: [Scoi2015]小凸玩矩阵 http://www.lydsy.com/JudgeOnline/problem.php?id=4443 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少. Input 第一行给出三个整数N,M,K 接下来N

codevs1322 单词矩阵

题目描述 Description 对于包含字母A到Y各一次的单词S,将其从上到下从左到右写在一个5*5的矩阵中,如单词ADJPTBEKQUCGLRVFINSWHMOXY写出来如下: A D J P T B E K Q U C G L R V F I N S W H M O X Y 若该矩阵满足每一行每一列的字母都是字典序递增的则称S为优美的,如上述单词就是优美的,而ADJPTBEGQUCKLRVFINSWHMOXY则不是(第二列不满足要求). Your Task 将所有优美的单词按字典序列出,从

LibreOJ #2006. 「SCOI2015」小凸玩矩阵

二次联通门 : LibreOJ #2006. 「SCOI2015」小凸玩矩阵 /* LibreOJ #2006. 「SCOI2015」小凸玩矩阵 本来以为是道数据结构题 后来想了想发现不可做 就考虑二分dp判断 推方程推不出来 就考虑用网络流判断了 二分出一个数 将小于这个数的位置的点编号 每行的可行点与下一行可行的点连边 后一边最大流判断可选出的数的个数是否符合要求即可 */ #include <cstdio> #include <iostream> #include <q

LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 N NN 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 N NN 个数中第 K KK 大的数字的最小值是多少. 输入格式 第一行给出三个整数

线性代数-矩阵-加减 C和C++实现

原理解析: (此处补图) 本节编写矩阵的加法和减法,两个矩阵相加,即把两个相同大小的矩阵对应的元素分别相加 .两个矩阵相减,把两个相同大小矩阵的对应元素分别相减. C++语言: 矩阵加法: 首先需要判断矩阵是否行列数相等,在计算中,由于存放矩阵m_vecMatrix我们使用的是二维vector,所以我们需要: 判断合法性 把两个矩阵的第i行元素提取出来 把两个矩阵中此行的第j个元素提取并相加,推入一个临时向量tempVec中, 通过addOneRowToBack()函数将tempVec加入目标向

HDU 2888:Check Corners(二维RMQ)

http://acm.hdu.edu.cn/showproblem.php?pid=2888 题意:给出一个n*m的矩阵,还有q个询问,对于每个询问有一对(x1,y1)和(x2,y2),求这个子矩阵中的最大值,和判断四个角有没有等于这个最大值的. 思路:二维RMQ模板题.注意内存卡的挺紧的. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5

瓷砖铺放 (状压DP+矩阵快速幂)

未加矩阵快速幂 50分 1 const dx:array[1..8,1..3] of longint= 2 ((-1,0,0),(-1,0,0),(1,0,0),(0,1,0),(-1,0,0),(-1,1,0),(0,1,0),(-1,0,1)); 3 dy:array[1..8,1..3] of longint= 4 ((0,1,0),(0,-1,0),(0,-1,0),(1,0,0),(0,1,-1),(0,0,-1),(1,0,-1),(0,1,0)); 5 mo=65521; 6 va

ZOJ2317-Nice Patterns Strike Back:矩阵快速幂,高精度

Nice Patterns Strike Back Time Limit: 20000/10000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Problem Description You might have noticed that there is the new fashion among rich people to have their yards tiled with black and white tile

poj2446Chessboard【矩阵建图+匈牙利】

大意: 已知有一个n*m的矩阵现在用1 * 2 的小木块去铺这个矩阵 ,矩阵中的黑点表示陷阱不可以铺,问能不能把除了陷阱之外的所有各自都铺满 nm<= 32 分析:第一印象是状压dp但是n太大, 后来网二分图方向考虑, 首先要构建一个二分图, 怎么构建呢, 我们可以从二分图的定义入手---分成两个部分,并且每个部分内部相互之间不能有边 对于一个矩阵有这么一个现象将每个点坐标的横纵坐标相加,那么和为奇数的点之间肯定不会相连 我们把和为奇数的作为白棋,把和为偶数的作为黑棋 那么用二分图或网络流都可以