codevs 1281 Xn数列 (矩阵乘法)

/*
再来个题练练手
scanf longlong 有bug.......

*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,x,y,x0,g;
ll f[3][3],a[3][3];
ll slow_mul(ll a,ll b,ll c)
{
    ll ans=0;
    a=a%c;b=b%c;
    while(b)
      {
          if(b&1)
            {
                b--;
                ans+=a;
                ans%=c;
          }
        a<<=1;a%=c;b>>=1;
      }
    return ans;
}
void mul(ll a[3][3],ll b[3][3])
{
    ll c[3][3];
    memset(c,0,sizeof(c));
    for(int i=1;i<=2;i++)
      for(int j=1;j<=2;j++)
        for(int k=1;k<=2;k++)
          c[i][j]=(c[i][j]+slow_mul(a[i][k],b[k][j],m))%m;
    for(int i=1;i<=2;i++)
      for(int j=1;j<=2;j++)
        a[i][j]=c[i][j];
}
int main()
{
    cin>>m>>x>>y>>x0>>n>>g;
    //scanf("%ld%ld%ld%ld%ld%ld",&m,&x,&y,&x0,&n,&g);
    f[1][1]=x0;f[1][2]=1;a[1][1]=x;a[1][2]=0;a[2][1]=y;a[2][2]=1;
    while(n)
      {
          if(n&1)mul(f,a);
          mul(a,a);
          n>>=1;
      }
    printf("%ld\n",f[1][1]%g);
    return 0;
}
时间: 2024-10-13 21:54:40

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

[CODEVS 1281] Xn数列

描述 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn http://codevs.cn/problem/1281/ 分析 比较裸的矩阵乘法题, 好久没做了, 写写思路 假设矩阵 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }. 根据矩阵乘法的计算方法, 有 : A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }. 那

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

【CODEVS】1281 Xn数列

[算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1    c        0    c   0 防止溢出可以用类似快速幂的快速乘. #include<cstdio> #include<algorithm> #define ll long long using namespace std; ll MOD,A,c,x0,n,g,a[2][2],b[2][2],t[2][2]; ll mull(ll x,ll y) {

【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,

C++之路进阶——矩阵乘法(Xn数列)

1281 Xn数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描述 Input Description 一行六个数 m, a, c, x0, n, g 输出描述 Output Description 输出一个数 Xn mod g 样例输入 Sample Inpu