ACM-矩阵专题

之前写过一篇矩阵的总结,但那时题目做得很少.点击打开链接

这次刷了个专题,写个总结 点击打开链接

水题:

A.典型的斐波那契递推构造

B.矩阵构造,就是按列递推

C.水题

G.水题

结合/技巧问题:

就是有的时候要计算C=A*B  C^N.这时候可能A * B的范围很大,那么就算A*(B*A)^(N-1)*B即可

E结合

H   S(N)=A+A^2+A^3+A^4+.....+A^N 两种方法,一种是二分即当N为偶数S(N)=(A+A^2+...+A^(N/2)(E+A^(N/2)),奇数S(N)=(A+A^2+...+A^(N/2)(E+A^(N/2))+A^N,

另一种是构造矩阵[S(N),An]

找规律:

1. 已知a+b,ab 求a^n+b^n. 设f(n)=a^n+b^n.

则f(n+1)=f(n)*(a+b)=a^(n+1)+b^(n+1)+ab(a^(n-1)+b^(n-1))

=(a+b)f(n)-abf(n-1)

2. L这个题的规律,打表找吧.

3.M 求 ceil((a+√b)^n)%m 的结果. 利用题目给定的b的范围发现可以写成ceil((a+√b)^n + (a-√b)^n)%m.等价于a^n+b^n 和1一样了

4.R   F[0] = a   F[1] = b   F[n] = F[n-1] * F[n-2] ( n > 1 )  求Fn, 这个拆分下发现

f(n)是斐波那契数列的第n项    F(n) = a^f(n-1)*b^f(n)

然后由费马小定理

a^f(n-1) = a^(f(n-1)%1000000006) (mod 1000000007)

b^f(n) = b^(f(n)%1000000006) (mod 1000000007) 这2个直接快速幂就行了

f(n)%1000000006这个用矩阵快速幂可以求

5.(f[1]+f[2]+...+f[n])=f[n+2]-1

构造一个矩阵, 使得各行和各列的值不同.

矩阵的上三角全为"1"

矩阵的下三角全为"-1"

对角线"1","0"交替.

如n = 4,对应矩阵为:

1 1 1 1

1 1 0 -1

1 1 -1 -1

0 -1 -1 -1

矩阵模版:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int MOD = 1000000007;
#define MaxSize 5
typedef long long type;
typedef long long LL;
LL n,k;
struct Mat{
    type arr[MaxSize][MaxSize];
    int r,l;
    Mat(int r=0,int l=0){
        this->r=r;
        this->l=l;
        memset(arr,0,sizeof(arr));
    }
    Mat operator * (const Mat &x){
        Mat ret(r,x.l);
        for(int i = 0;i<r;i++)
            for(int j = 0;j<l;j++)
                for(int k = 0;k<x.l;k++)
                    ret.arr[i][j] = (ret.arr[i][j]+arr[i][k]*x.arr[k][j] %MOD)%MOD;
        return ret;
    }

};
Mat pow_mat(LL n,Mat basic){
    Mat ret(2,2);
    ret.arr[0][0]=ret.arr[1][1]=1;
    while(n>0){
        if(n&1)
            ret = ret*basic;
        basic = basic*basic;
        n>>=1;
    }return ret;
}
LL solve(LL nn){
    LL ret;
    if(nn==1)
        return 1;
    Mat e(2,2);
    e.arr[0][0]=e.arr[0][1]=e.arr[1][0]=1;
    e = pow_mat(nn/2,e);
    ret = e.arr[0][0] * (LL)pow(nn/2,k) +1;
    ret = ret * solve(nn/2)%MOD;
    if(nn&1)
        ret = ret*(pow_mat(nn,e).arr[0][0])%MOD;
    return ret;
}
int main(){
    int cas=1;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%I64d%d",&n,&MOD);
        printf("Case %d: ",cas++);
        Mat e(2,2);
        e.arr[0][0]=e.arr[0][1]=e.arr[1][0]=1;
        e = pow_mat(n,e);
        int ans = (e.arr[0][0] + e.arr[1][0]-1+MOD)%MOD;
        if(ans==0){
            puts("No");
            continue;
        }puts("Yes");
        for(int i = 0;i<ans;i++){
            for(int j = 0;j<i;j++)
                printf("-1 ");
            if(i%2==0) {
                if(i==ans-1) printf("0\n");
                else printf("0 ");
            }
            if(i%2==1) {
                if(i==ans-1) printf("1\n");
                else printf("1 ");
            }
            for(int j = i+1;j<ans;j++)
                if(j==ans-1)  printf("1\n");
                else printf("1 ");
        }

    }
    return 0;
}
时间: 2024-07-31 12:45:36

ACM-矩阵专题的相关文章

矩阵专题(续)

哈哈哈,失踪人员回归.最近总是在忙一些乱七八糟的事情,终于有了一段空闲时间可以刷刷题了.学姐给我准备了kuangbin先生的矩阵专题,作为我的矩阵终结专题.(初学者请先看我的矩阵专题前三篇) 第一题 CodeForces 450B 分析:这道题看似是一道矩阵题,但是实际上是一道模拟题.看题目给出的公式 f(i)=f(i-1)+f(i+1),i>=2,那么转换一下得到了f(i)=f(i-1)-f(i-2),i>=3,当然这题可以使用矩阵快速幂来算,但是多此一举.不妨将f(1)=x  f(2)=y

ACM 矩阵题目整理

先从最基础的矩阵快速幂加速递推开始. HDU 1005 Number Sequence |f[n-2],f[n-1]|* |0 B| =|f[n-1], B*f[n-2]+A*f[n-1]|=|f[n-1],f[n]|   |1 A| 建立矩阵如上然后利用快速幂求解即可.答案是mat[0][1]. #include<iostream> #include<vector> #include<cmath> #include<map> #include<alg

矩阵专题

1)矩阵快速幂 POJ - 3070 .HDU - 1575 .| 2)矩阵快速幂+玄学 *HDU - 3117.LightOJ - 1070  *HDU - 3306.| HDU - 3483.**HDU - 4566.*HDU - 4565. *FZU - 1692 3)组合恒等变换构造矩阵 *HDU - 2855| 5)矩阵维护线性递推式 *HDU - 2604.LightOJ - 1131.LightOJ - 1142.HDU - 1757 .HDU - 1005.*HDU - 1588

线段树专题(一)

Acmer可怜啊,根本没有休息,昨天才刚刚完成了矩阵专题,今天又要开线段树专题了.唉,等我以后月薪15K的时候,我要好好享受人生......呃,扯远了.线段树是一个非常重要的数据结构,以前就学习过,但是没有系统的刷过难题,这次我决定将kuangbin先生的专题和NotOnlySuccess大神的专题一起刷掉.因为题目多又难,所以分成几个部分(最多三个把). 对于线段树的话,主要是理解它的树形结构吧,推荐和树状数组一起学习.似乎树状数组就是线段树的退化,树状数组节约了差不多一半的空间,但是必须满足

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

paper 131:【图像算法】图像特征:GLCM【转载】

转载地址:http://www.cnblogs.com/skyseraph/archive/2011/08/27/2155776.html 一 原理 1 概念:GLCM,即灰度共生矩阵,GLCM是一个L*L方阵,L为源图像的灰度级 2 含义:描述的是具有某种空间位置关系的两个像素的联合分布,可看成两个像素灰度对的联合直方图,是一种二阶统计 3 常用的空间位置关系:有四种,垂直.水平.正负45° 4 常用的GLCM特征特征: (1)能量:  是灰度共生矩阵元素值的平方和,所以也称能量,反映了图像灰

【图像算法】图像特征:GLCM灰度共生矩阵,纹理特征

[图像算法]图像特征:GLCM SkySeraph Aug 27th 2011  HQU Email:[email protected]    QQ:452728574 Latest Modified Date:Aug 27th 2011 HQU ------------------------------------------------------------------------------------------------------------------------------

每日总结-05-14

为了准备区域赛,决定每天都写一个总结,记录一下今天做了什么事情,如果没做啥有意义的事情,就不总结了. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

矩阵快速幂专题(一)

最近闲来无事,准备集中精力刷一波数论与图论.矩阵快速幂是数论里面的重要组成部分,值得我好好学习一下.因为题目比较多,分析也比较多,所以将此专题分成几个部分.做完这一专题,可能会暂时转向图论部分,然后等我组合数学学得差不多了,再回过头来继续做数论题. 矩阵快速幂算法的核心思想是将问题建模转化为数学模型(有一些简单题目是裸的矩阵模型,但是大部分难题就是难在要构造矩阵,用矩阵方法解决问题),推倒递推式,构造计算矩阵,用快速幂的思想求解矩阵A的n次方取mod,从而得到矩阵里面你需要的数据. 矩阵快速幂问

矩阵快速幂专题(三)

哈哈哈,博主又回来了!这次专题是第三弹也是最后一弹了,这次会对矩阵进行一个小收尾.做完这25道题,我感觉到其实我矩阵学得并不好,还有许多知识点没有学会.后面看情况可能还会继续开矩阵的专题,那应该是几个月以后的事了.从下周开始,应该会先学习一下数论的相关算法! 这次的七道题目(为什么题目越来越少了)主要是针对了矩阵的优化,对于会TLE的和MLE(内存爆了)的矩阵而且这个矩阵又恰好是同构矩阵(同构矩阵是啥?)的话,可以采用一维数组来模拟二维,从而降低复杂度.降低空间.(竟然是罕见的同时降时间和空间的