[WikiOI "天梯"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
输入描述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 ;
}
那么题目所求就可转化为一个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数列的更多相关文章
- 【wikioi】1281 Xn数列(矩阵乘法)
http://wikioi.com/problem/1281/ 矩阵真是个神奇的东西.. 只要搞出一个矩阵乘法,那么递推式可以完美的用上快速幂,然后使复杂度降到log 真是神奇. 在本题中,应该很快能 ...
- Codevs No.1281 Xn数列
2016-06-01 16:28:25 题目链接: Xn数列 (Codevs No.1281) 题目大意: 给定一种递推式为 Xn=(A*Xn-1+C)%M 的数列,求特定的某一项%G 解法: 矩阵乘 ...
- 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 输入 ...
- 【CODEVS】1281 Xn数列
[算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1 c 0 c 0 防止溢出可以用类似快速幂的快速乘. ...
- codevs 1281 Xn数列 (矩阵乘法)
/* 再来个题练练手 scanf longlong 有bug....... */ #include<cstdio> #include<iostream> #include< ...
- C++之路进阶——codevs1281(Xn数列)
1281 Xn数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你6个数,m, a, c, x0, n, ...
- 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 输入 ...
- 【wikioi】1250 Fibonacci数列(矩阵乘法)
http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...
- 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 输入 ...
随机推荐
- Spark-2.3.2【SparkStreaming+SparkSQL-实时仪表盘应用】
应用场景:实时仪表盘(即大屏),每个集团下有多个mall,每个mall下包含多家shop,需实时计算集团下各mall及其shop的实时销售分析(区域.业态.店铺TOP.总销售额等指标)并提供可视化展现 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第三周作业
<Linux内核原理与分析>第三周作业 教材学习总结 第三章 进程管理 进程是Unix操作系统抽象概念中最基本的一种,是正在执行的程序代码的实时结果:线程,是在进程中活动的对象.而Linu ...
- centos7安装libvirt支持xen
另外还有一个非常棒的用法 假如我要执行iostat这个命令来查看CPU与存储设备状态,可是执行却发现没有这个命令 于是执行yum install iostat,结果说找不到该软件,使用下面的办法可以解 ...
- Linux内核基础--事件通知链(notifier chain)good【转】
转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3. 运行机理 1. ...
- Centos_Lvm expand capacity without restarting CentOS
Rescan the new disk(/dev/sdb): #ls /sys/class/scsi_host/ host0 host1 host2 [root@db210_13:56:14 /dat ...
- yml格式
是什么? yml文件扩展名是YAML的缩写,YAML于2001年出现,是一种数据描述语言,和xml类似 为什么用它? 我们在做javaweb项目的时候最常见的就是.xml配置文件和properitie ...
- HTML5API(2)
四.文件API 1.概述 H5允许JS有条件的读取客户端文件 允许读取的文件:1.待上传的文件2.拖进浏览器的文件 多文件上传设置属性multiple 过滤上传文件类型 设置accept属性 acce ...
- clearcase command (linux 常用命令)
http://publib.boulder.ibm.com/infocenter/cchelp/v7r0m0/index.jsp?topic=/com.ibm.rational.clearcase.h ...
- Oralce Spatial
1.建立数据库连接 create public database link ytlink connect to hightop identified by hightop using '(DESCRI ...
- 高德地图web 端智能围栏
最近有个项目,需要在web上批量给设备设置智能围栏,设备超出范围报警,查看高德地图webJS API,web端操作案例如,后台判断没有提供源码 <!-- 重点参数:iconStyle --> ...