题面:

传送门

思路:

看一眼这个公式:

$x\left[n+1\right]=\left(a\ast x\left[n\right]+c\right) mod m$

递推,数据范围$n\leq 10^18$,自然想到矩阵快速幂

构造如下矩阵:

状态矩阵:

$\begin{bmatrix}x\lbrack i\rbrack&1\end{bmatrix}$

转移矩阵:

$\begin{bmatrix}a&0\\c&1\end{bmatrix}$

从x[0]开始做转移矩阵的n次幂,再乘上状态矩阵即可

Code:

 // luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll n,m,A,C,st,g;
ll mul(ll l,ll r){
ll re=;if(l<r) swap(l,r);
while(r){
if(r&1ll) re=(re+l)%m;
r>>=1ll;l=(l+l)%m;
}
return re;
}
struct ma{
ll a[][],n,m;
ma(){memset(a,,sizeof(a));n=m=;}
void clear(){memset(a,,sizeof(a));n=m=;}
const void operator =(const ma &b){
n=b.n;m=b.m;ll i,j;
for(i=;i<=n;i++) for(j=;j<=n;j++) a[i][j]=b.a[i][j];
}
}a,b;
ma mmul(ma x,ma y){
ma re;re.n=x.n;re.m=y.m;ll i,j,k;
for(i=;i<=x.n;i++){
for(j=;j<=y.m;j++){
for(k=;k<=x.m;k++){
re.a[i][j]+=mul(x.a[i][k],y.a[k][j]);
re.a[i][j]%=m;
}
}
}
return re;
}
ma ppow(ma x,ma y,ll t){
while(t){
if(t&1ll) x=mmul(x,y);
y=mmul(y,y);t>>=1ll;
}
return x;
}
int main(){
m=read();A=read();C=read();st=read();n=read();g=read();
a.n=;a.m=;b.n=b.m=;
a.a[][]=st;a.a[][]=;
b.a[][]=A;b.a[][]=C;b.a[][]=;
ma ans=ppow(a,b,n);
printf("%lld",ans.a[][]%g);
}

[luogu2044][NOI2012] 随机数生成器 [矩阵快速幂]的更多相关文章

  1. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  2. [日常摸鱼]bzoj2875[NOI2012]随机数生成器-矩阵快速幂

    好裸的矩阵快速幂-然而我一开始居然构造不出矩阵- 平常两个的情况都是拿相邻两项放在矩阵里拿去递推的-然后我就一直构造不出来-其实把矩阵下面弄成1就好了啊orz #include<cstdio&g ...

  3. bzoj2875随机数生成器——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵快速幂,把x和c分开求,最后加上即可: 为防止爆long long,要用快速乘. ...

  4. Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)

    2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...

  5. [NOI2012]随机数生成器 矩阵乘法

    Code: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring& ...

  6. 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器

    963. [NOI2012] 随机数生成器 ★★   输入文件:randoma.in   输出文件:randoma.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 栋 ...

  7. [NOI2012]随机数生成器【矩阵快速幂】

    NOI2012 随机数生成器 题目描述 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法 ...

  8. 【BZOJ2875】【NOI2012】随机数生成器(矩阵快速幂)

    [BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...

  9. BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘

    题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...

随机推荐

  1. 感谢我的python老师

    Python自动化开发(金角大王版) http://www.cnblogs.com/alex3714/articles/5885096.html

  2. C++unsigned char和char区别

    char和unsigned charchar与unsigned char都是一个字节8bit,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char( ...

  3. SpringBoot学习记录(一)

    1. Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1. @Configuration 和 @Bean Spring的Java配置方式是 ...

  4. C# 创建和初始化集合对象

    一. 引言 C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单.假定你有一个类Student,它看起来有如下样子: public class Stude ...

  5. curl_easy_setopt函数介绍

    本节主要介绍curl_easy_setopt中跟http相关的参数.注意本节的阐述都是以libcurl作为主体,其它为客体来阐述的. 1.     CURLOPT_URL 设置访问URL 2.     ...

  6. python的对数

    python的对数 首先要导入 math 模块: import math import numpy as np math.log(8,2),此为以2为底8的对数 等于 math.log2(8); 等于 ...

  7. 多种语言书写 “ HelloWorld ”

    最基本的C: #include<stdio.h> int main(int argc, char const *argv[]) { printf("HelloWorld\n&qu ...

  8. H5各种头部meta标签的功能

    <!DOCTYPE html>  H5标准声明,使用 HTML5 doctype,不区分大小写 <head lang=”en”> 标准的 lang 属性写法 <meta ...

  9. 删除Zend Studio项目

    导入了过大的项目,导致很卡,且Close Project和Delete操作不了,一直无响应. 调整项目目录下的隐藏文件夹,删除对应项目: E:\www\.metadata\.plugins\org.e ...

  10. JZOJ 4737. 金色丝线将瞬间一分为二 二分答案

    4737. 金色丝线将瞬间一分为二 Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto ProblemSet ...