codevs 3332 数列 (矩阵乘法)

/*
裸地矩阵乘法
矩阵很好想的
1 1 0
0 0 1
1 0 0
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define mod 1000000007
#define ll long long
using namespace std;
int T,n;
ll f[4][4],a[4][4];
void mul(ll a[4][4],ll b[4][4])
{
    ll c[4][4];
    memset(c,0,sizeof(c));
    for(int i=1;i<=3;i++)
      for(int j=1;j<=3;j++)
        for(int k=1;k<=3;k++)
          c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;
    for(int i=1;i<=3;i++)
      for(int j=1;j<=3;j++)
        a[i][j]=c[i][j];
}
int main()
{
    scanf("%d",&T);
    while(T--)
      {
          memset(f,0,sizeof(f));
          memset(a,0,sizeof(a));
          a[1][1]=1;a[1][2]=1;a[2][3]=1;a[3][1]=1;f[1][1]=1;f[1][2]=1;
          scanf("%d",&n);
          if(n<=3)
            {
                printf("1\n");
                continue;
          }
          n-=2;
          while(n)
            {
                if(n&1)mul(f,a);
                mul(a,a);
                n>>=1;
          }
        printf("%ld\n",f[1][1]);
      }
    return 0;
}
时间: 2024-12-22 13:05:49

codevs 3332 数列 (矩阵乘法)的相关文章

Fibonacci数列--矩阵乘法优化

Fibonacci数列 题目描述 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30000. 输入描述 第一行一个数T(1<=T<=10000). 以下T行,每行两个数,n,q(n<=109, 1<=q<=30000) 输出描述 文件包含T行,每行对应一个答案. 样例输入 3 6 2 7 3 7 11 样例输出 1 0 10 数据范围及提示 1<=T<

P1349 广义斐波那契数列(矩阵乘法)

题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatrix} p&q\1&0\\end{bmatrix}^{n-2}=\begin{bmatrix}f_n\\f_{n-1} \end{bmatrix}\] 水题 代码 #include <bits/stdc++.h> #define int long long using namesp

CODEVS1533 Fibonacci数列 (矩阵乘法)

嗯,,,矩阵乘法最基础的题了. Program CODEVS1250; type arr=array[1..2,1..2] of longint; var T,n,mo:longint; a,b:arr; operator *(a,b:arr) c:arr; var i,j,k,sum:longint; begin fillchar(c,sizeof(c),0); for i:=1 to 2 do for j:=1 to 2 do begin sum:=0; for k:=1 to 2 do s

【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂

题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj (1<=j<=k)是给定的自然数.写一个程序,给定自然数m <= n, 计算am + am+1 + am+2 + ... + an, 并输出它除以给定自然数p的余数的值. 输入 由四行组成. 第一行是一个自然数k. 第二行包含k个自然数b1, b2,...,bk. 第三行包含k个自然数c1,

洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请你求出 f(n) mod 1000000007 的值. 输入输出格式 输入格式: ·第 1 行:一个整数 n 输出格式: 第 1 行: f(n) mod 1000000007 的值 输入输出样例 输入样例#1: 5 输出样例#1: 5 输入样例#2: 10 输出样例#2: 55 说明

[luogu2461 SDOI2008] 递归数列 (矩阵乘法)

传送门 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj 和 cj (1<=j<=k)是给定的自然数.写一个程序,给定自然数m <= n, 计算am + am+1 + am+2 + ... + an, 并输出它除以给定自然数p的余数的值. Input 输入文件spp.in由四行组成. 第一行是一个自然数k. 第二行包含k个自然数b1,

矩阵乘法2 (Codevs No.3147)

2016-06-01 17:33:30 题目链接: 矩阵乘法2 (Codevs No.3147) 题目大意: 给定两个大小相同的正方形矩阵A,B.多次询问,每次求乘后矩阵的一个子矩阵所有元素的和. 解法: 首先想到暴力. 预处理N^3,询问模拟扫,这常数简直瞬间爆炸啊 当然是可以优化的. 列出子矩阵的元素表达式,就会发现有一些元素//矩阵乘法2 (Codevs No.3147)//矩阵乘法#include<stdio.h>#include<algorithm>using names

矩阵乘法快速幂 codevs 1250 Fibonacci数列

codevs 1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30000. 输入描述 Input Description 第一行一个数T(1<=T<=10000). 以下T行,每行两个数,n,q(n<=109, 1<

那条矩阵乘法的不归路——数列

话说今天搜矩阵相乘,没有一个人用pascal写,是不是学到矩阵相乘的孩子都果断转c++了...我可是有良心的写博人,当然附上pascal代码 故事开始了 今天看到这样一个题 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1]  (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 然后是它的数据范围 对于30%的数据 n<=100: 对于60%的数据 n<=2*10^7: 对于100%的数据 T<=100,n<=2*10^9: 当我