洛谷 P2044 [NOI2012]随机数生成器
题意简述
读入X[0], m, a, c, n和g
$ X[n+1]=(a*X[n]+c)\mod m $
求X数列的第n项对g取余的值。
题解思路
矩阵加速
设$$ F=\begin{bmatrix} a&0\1&1\end{bmatrix}, G=\begin{bmatrix} X[0]\c\end{bmatrix}$$
则$$ \begin{bmatrix} X[n]\c\end{bmatrix} = G * F ^ n (n > 0)$$
乘法用快速乘
代码
#include <cstdio>
typedef long long ll;
int T, N, g;
ll n, m, aa, cc, x0, mod;
struct Matrix
{
ll a[4][4];
Matrix& operator =(const Matrix& x)
{
for (register int i = 1; i <= N; ++i)
for (register int j = 1; j <= N; ++j)
a[i][j] = x.a[i][j];
return *this;
}
};
Matrix a, b, c;
ll _mul(ll x, ll y, ll s = 0)
{
for (; y; y >>= 1, x = (x + x) % mod)
if (y & 1)
s = (s + x) % mod;
return s;
}
Matrix Mul(const Matrix& x, const Matrix& y)
{
Matrix s;
for (register int i = 1; i <= N; ++i)
for (register int j = 1; j <= N; ++j)
s.a[i][j] = 0;
for (register int i = 1; i <= N; ++i)
for (register int j = 1; j <= N; ++j)
for (register int k = 1; k <= N; ++k)
s.a[i][j] = (s.a[i][j] + _mul(x.a[i][k], y.a[k][j])) % mod;
return s;
}
Matrix _pow(Matrix x, ll y)
{
Matrix s;
for (register int i = 1; i <= N; ++i)
for (register int j = 1; j <= N; ++j)
s.a[i][j] = (i == j);
for (; y; y >>= 1, x = Mul(x, x)) if (y & 1) s = Mul(s, x);
return s;
}
int main()
{
N = 2;
scanf("%lld%lld%lld%lld%lld%d", &m, &aa, &cc, &x0, &n, &g);
mod = m;
c.a[1][1] = x0; c.a[1][2] = cc;
a.a[1][1] = aa; a.a[2][1] = a.a[2][2] = 1;
if (n <= 0) {printf("%lld\n", x0); return 0; }
b = Mul(c, _pow(a, n));
printf("%lld\n", (b.a[1][1] + mod) % mod % g);
}
洛谷 P2044 [NOI2012]随机数生成器的更多相关文章
- [洛谷P2044][NOI2012]随机数生成器
题目大意:给你$m,a,c,X_0,n,g$,求$X_{n+1}=(a\cdot X_n+c) \bmod{m}$,最后输出对$g$取模 题解:矩阵快速幂+龟速乘,这里用了$long\;double$ ...
- P2044 [NOI2012]随机数生成器
洛咕原题 正常的矩乘题. 但是,计算过程中会爆long long. 所以,我们要用快速(龟速)乘来解决. 快速乘,也就是把快速幂稍作修改.乘法被分成若干个加法,以时间为代价解决精度问题. #inclu ...
- 【洛谷P3600】 随机数生成器
https://www.luogu.org/problem/show?pid=3600#sub (题目链接) 题意 一个$n$个数的序列,里面每个数值域为$[1,X]$.给$q$个区间,每个区间的权值 ...
- 洛谷P3306 [SDOI2013]随机数生成器(BSGS)
传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...
- 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 栋 ...
- BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
- Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)
2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...
- [NOI2012]随机数生成器【矩阵快速幂】
NOI2012 随机数生成器 题目描述 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法 ...
随机推荐
- Discuz ML! V3.X 代码注入漏洞
Discuz ML! V3.X 代码注入漏洞 前言 Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台,用于构建像"社交网络"这样的互 ...
- .NET多线程之Thread、Task、ThreadPool、Timer
下表为多线程操作常见对象: 对象 方法/属性 描述 用途 用法 性能 Thread(线程) Start 启动线程,启动后线程处于System.Threading.ThreadState.Running ...
- linux下运行python3出现TypeError: a bytes-like object is required, not 'str'
目标:用python将中文存入csv,且中文正常显示. 环境:linux,python3 百度N久,方法都不行或是比较复杂. 以上代码用python3运行后,出现TypeError: a bytes- ...
- Python 3.5学习笔记(第二章)
本章内容 1.模块 2.数据类型与数据运算 3.进制 4.byte 与 string 的互相转换 5.列表 6.元组 7.字符串操作 8.字典 一.模块 Python 把某些常用的定义存放在文件中,为 ...
- isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)
6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...
- c语言的strcpy函数
strcpy是用于复制字符串的函数 上面这个程序输出的结果为 为什么输出字符串%s时s是abABC,而输出字符%c时s是abABCg呢 因为strcpy函数本身的性质:复制字符串直到’\0’结束符为止 ...
- windows和linux下如何对拍
对拍是各种计算机考试检查时必备工具,实际上十分强大,只要你的暴力没有写错就没有问题. 对拍的意思:(怎么有点语文课的意思雾) 对:看见'对'就可以知道有两个. 拍:就是把两个程序结果拍在一起,对照(有 ...
- Python装饰器 (转)
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身. #多个装饰器 import time def deco01(func): def wrapper(*args, ** ...
- 又一个轮子--QMapper
1 前言 我喜欢造轮子,一是造的时候就是深刻学习的时候,二是造着造着,说不定某天比世面上的其它轮子都要好呢.比如造过Networksocket,也造过WebApiClient,现在我也要造一个Mapp ...
- 自己动手,开发轻量级,高性能http服务器。
前言 http协议是互联网上使用最广泛的通讯协议了.web通讯也是基于http协议:对应c#开发者来说,asp.net core是最新的开发web应用平台.由于最近要开发一套人脸识别系统,对通讯效率的 ...