题目描述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 Input

11 8 7 1 5 3

样例输出Sample Output

2

数据范围及提示Data Size & Hint

int64按位相乘可以不要用高精度。

题目分析
        典型的矩阵快速幂问题。由递推式 Xn+1 = ( aXn + c ) mod m 可以构造出矩阵方程:

那么题目所求就可转化为一个1*2矩阵与n个二阶方阵的矩阵链乘。根据矩阵乘法的结合律,可得出:


    即可转化为矩阵快速幂问题。其中的乘法运算已改为了倍增取模乘法。

 
 1 //WikiOI 1281 Xn数列
 2 #include <iostream>
 3 using namespace std;
 4 typedef long long LL;
 5 LL m, a, c, x0, n, MOD;
 6 LL mlti(LL a, LL b) //倍增取模乘法
 7 {
 8     a %= m;
 9     LL ans = ;
     while(b)
     {
         if(b & )ans = (ans + a)% m;
         a = (a << )% m;
         b >>= ;
     }
     return ans;
 }
 struct Matrix2
 {
     LL val[][];
     Matrix2(LL k1,LL k2,LL k3,LL k4)
     {
         val[][] = k1; val[][] = k2; val[][] = k3; val[][] = k4;
     }
     void Mlti(Matrix2 &m) //矩阵乘法
     {
         LL v1 = mlti(val[][],m.val[][])+mlti(val[][],m.val[][]);
         LL v2 = mlti(val[][],m.val[][])+mlti(val[][],m.val[][]);
         LL v3 = mlti(val[][],m.val[][])+mlti(val[][],m.val[][]);
         LL v4 = mlti(val[][],m.val[][])+mlti(val[][],m.val[][]);
         val[][] = v1,val[][] = v2,val[][] = v3,val[][] = v4;
     }
 };
 
 int main()
 {
     ios::sync_with_stdio(); //感谢陈思学长!
     cin >>m >>a >>c >>x0 >>n >>MOD;
     Matrix2 M(a, , , );
     Matrix2 ans = M;
     n -= ;
     while(n)
     {
         if(n & ) ans.Mlti(M);
         M.Mlti(M);
         n >>=;
     }
     cout << ((mlti(x0, ans.val[][])+mlti(c, ans.val[][]))%m)%MOD;
     return ;
 }

[WikiOI "天梯"1281] Xn数列的更多相关文章

  1. 【wikioi】1281 Xn数列(矩阵乘法)

    http://wikioi.com/problem/1281/ 矩阵真是个神奇的东西.. 只要搞出一个矩阵乘法,那么递推式可以完美的用上快速幂,然后使复杂度降到log 真是神奇. 在本题中,应该很快能 ...

  2. Codevs No.1281 Xn数列

    2016-06-01 16:28:25 题目链接: Xn数列 (Codevs No.1281) 题目大意: 给定一种递推式为 Xn=(A*Xn-1+C)%M 的数列,求特定的某一项%G 解法: 矩阵乘 ...

  3. codevs 1281 Xn数列

    题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...

  4. 【CODEVS】1281 Xn数列

    [算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1    c        0    c   0 防止溢出可以用类似快速幂的快速乘. ...

  5. codevs 1281 Xn数列 (矩阵乘法)

    /* 再来个题练练手 scanf longlong 有bug....... */ #include<cstdio> #include<iostream> #include< ...

  6. C++之路进阶——codevs1281(Xn数列)

    1281 Xn数列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 给你6个数,m, a, c, x0, n, ...

  7. Xn数列(codevs 1281)

    题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...

  8. 【wikioi】1250 Fibonacci数列(矩阵乘法)

    http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...

  9. codevs1281 Xn数列

    题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...

随机推荐

  1. Spring cloud 实战读书笔记

    基础知识 Spring cloud 版本说明 Brixton.SR5 :Brixton 的第5个Release版本 SRX:service releases 简称SRX版本,X版本号 Spring b ...

  2. Linux内核堆栈使用方法 进程0和进程1【转】

    转自:http://blog.csdn.net/yihaolovem/article/details/37119971 目录(?)[-] 8 Linux 系统中堆栈的使用方法 81  初始化阶段 82 ...

  3. python基础===Python 迭代器模块 itertools 简介

    本文转自:http://python.jobbole.com/85321/ Python提供了一个非常棒的模块用于创建自定义的迭代器,这个模块就是 itertools.itertools 提供的工具相 ...

  4. pandas+sqlalchemy 保存数据到mysql

    import pandas as pd from sqlalchemy import create_engine data3={"lsit1":[1,2],"lsit2& ...

  5. 【UOJ#164】清华集训2015V

    QwQzcysky真是菜死了,这是我刚上高一的时候坤爷在夏令营讲的,可是今天才切掉…… 想想也神奇,一个2016.11才学会线段树的菜鸡,夏令营的时候居然听过Segment-Tree-Beats? 所 ...

  6. Smarty模板快速入门

    文件下载 1.下载地址:http://www.smarty.net/ 2.我下载的版本是3.1.27 ,将下载的文件smarty-3.1.27.zip解压出来,然后将libs文件夹的所有文件复制到你的 ...

  7. MYSQL表中向SET类型的字段插入值时值之间不能有空格

    MYSQL 中有一种数据类型是 SET,首先我们查看一个包含 SET 类型字段的表结构: 接下来我们向表中插入数据: 按照上面的语句插入数据发现报错了,于是去掉了插入值之间的空格,然后插入成功:

  8. Linux 基础——ls 命令

    第二天,继续学习Linux命令... 一.查看文件和目录列表的命令 ls:显示当前目录下的文件和目录,但是不会显示隐藏的文件和目录. ls -a:显示当前目录下的所有文件和目录. ls -l:显示当前 ...

  9. Linux之父Linus的8个趣闻轶事

    博客中的文章均为 meelo 原创,请务必以链接形式注明本文地址 <只是为了好玩:Linux之父林纳斯自传>是一本很古老的书了,2001年就有了中文版,在2014的时候图灵图书又把它重新翻 ...

  10. netcore 配置文件使用

    一直在记录整理接口调用,但是最近发现关于项目在vs中本地启动也有许多方便的地方. 首先由于使用的是Java的Eureka和网关来做的服务基础, 然后服务就涉及到注册一说, 问题是,如果appsetti ...