codevs1281 Xn数列
给你6个数,m, a, c, x0, n, g
Xn+1 = ( aXn + c ) mod m,求Xn
m, a, c, x0, n, g<=10^18
一行六个数 m, a, c, x0, n, g
输出一个数 Xn mod g
11 8 7 1 5 3
2
int64按位相乘可以不要用高精度。
正解:矩阵快速幂+矩阵乘法
解题报告:
对于一个递推式,求某一项的值。
这显然是可以矩阵乘法的,用一下快速幂就可以了。但是注意一点,因为对于long long下的乘法很有可能会乘炸,所以我们需要用加法模拟一下乘法(快速幂的形式),就可以啦。
代码如下:
//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
LL MOD,A,C,n,g;
struct matrix{
LL a[][];
}ans,init; inline LL getlong()
{
LL w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline LL quick_cj(LL x,LL y){//为防止溢出,用快速幂的方法,用加法代替乘法
LL da=;
while(y>) {
if(y&) da+=x,da%=MOD;
x+=x; x%=MOD;
y>>=;
}
return da;
} inline matrix cj(matrix a,matrix b){
matrix c=init;
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
c.a[i][j]+=quick_cj(a.a[i][k],b.a[k][j]),c.a[i][j]%=MOD;
return c;
} inline matrix mul(LL x){
matrix base,tmp; tmp=base=init;
tmp.a[][]=; tmp.a[][]=;
base.a[][]=A; base.a[][]=;
base.a[][]=base.a[][]=;
while(x>) {
if(x&) tmp=cj(tmp,base);
base=cj(base,base);
x>>=;
}
return tmp;
} inline void work(){
MOD=getlong(); A=getlong(); C=getlong();
ans.a[][]=getlong(); ans.a[][]=C; n=getlong(); g=getlong();
for(int i=;i<;i++) for(int j=;j<;j++) init.a[i][j]=;
ans=cj(ans,mul(n));
printf("%lld",ans.a[][]%g);
} int main()
{
work();
return ;
}
codevs1281 Xn数列的更多相关文章
- CODEVS1281 Xn数列 (矩阵乘法+快速乘)
真是道坑题,数据范围如此大. 首先构造矩阵 [ f[0] , 1] * [ a,0 ] ^n= [ f[n],1 ] [ c,1 ] 注意到m, a, c, x0, n, g<=10^18,所以 ...
- C++之路进阶——codevs1281(Xn数列)
1281 Xn数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你6个数,m, a, c, x0, n, ...
- Codevs No.1281 Xn数列
2016-06-01 16:28:25 题目链接: Xn数列 (Codevs No.1281) 题目大意: 给定一种递推式为 Xn=(A*Xn-1+C)%M 的数列,求特定的某一项%G 解法: 矩阵乘 ...
- [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 输入描 ...
- 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 输入 ...
- 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】1281 Xn数列(矩阵乘法)
http://wikioi.com/problem/1281/ 矩阵真是个神奇的东西.. 只要搞出一个矩阵乘法,那么递推式可以完美的用上快速幂,然后使复杂度降到log 真是神奇. 在本题中,应该很快能 ...
- 【CODEVS】1281 Xn数列
[算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1 c 0 c 0 防止溢出可以用类似快速幂的快速乘. ...
- Xn数列
题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输 ...
随机推荐
- 前台freemark获取后台的值
1.后台代码: ModelAndView mv = new ModelAndView("log/logList.ftl"); String info="abc" ...
- jeecms搜索结果排序-二次开发
jeecms搜索用的是apache Lucene,要实现此功能得先去学习它. 直接上代码 package com.jeecms.cms.lucene; import java.io.IOExcepti ...
- Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)
Anaconda(3-5.0.1,Python3.6)下载链接:https://pan.baidu.com/s/1bqFwLMB 密码:37ih Pycharm(community-2017.3.3) ...
- ffmpeg保存原始数据PCM YUV
保存yuv ffmpeg -i video.mp4 -c:v rawvideo -pix_fmt yuv420p out.yuv 保存pcm ffmpeg -i input.flv -f s16le ...
- Centos date 设置自定义时间
[1]手动修改 (1)设置日期 # date -s 20190315 (2)设置时间 # date -s 15:23:34 (3)设置日期和时间 # date -s "20190315 15 ...
- Java多线程编程总结一:多线程基本概念
Java多线程编程总结一 – 初识多线程 进程.多进程.线程.多线程的概念 进程(process):CPU的执行路径.通俗的说就是系统中正在运行的程序.比如我们打开了浏览器.QQ等等,这些程序一旦被打 ...
- 多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...
- urllib.urlencode() 无法encode中文, UnicodeEncodeError
urllib.urlencode() 无法encode中文, UnicodeEncodeError, 具体错误内容如下:File "/System/Library/Frameworks/Py ...
- IOS连接
http://www.wuleilei.com/blog/323 不错 http://blog.csdn.net/totogo2010/ http://blog.csdn.net/totogo2010 ...
- iOS 线程管理的学习记录
本文转载至 http://www.2cto.com/kf/201312/265451.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...