2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化
B - generator 1
题意
给你\(x_{0}、x_{1}、a、b、b、mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\)
思路
一般看到这种题就会想到矩阵快速幂,但是这次的\(n\)太大了,所以要用十进制倍增来算,但是单单用十进制倍增来算应该还会\(TLE\),然后就要用二进制倍增来优化了。
- 我们要先求出矩阵快速幂的通项式
\begin{pmatrix}a & b\\1& 0 \end{pmatrix}
\begin{pmatrix}x_{n}\\ x_{n-1}\end{pmatrix}=
\begin{pmatrix}a & b\\1& 0 \end{pmatrix}^{n}
\begin{pmatrix}x_{1}\\ x_{0}\end{pmatrix}\]
- 用十进制和二进制优化
for(int i = len-1; i >= 0; i--){
ans = ans*pow(res, n[i]-'0');
res = pow(res, 10ll);
}
\(ans = res^{(n[i] - '0')}、(n[i] - '0')\):是当前位的数
\(res = res^{10}\)、
就是把\(n\)分解成每一位,然后相乘
例如\(a^{300} = (a^{100})^{3}\) => \(ans = (res^{10})^{n[i]-'0'}\)
计算每一位就可以了
(说的有点混乱,主要是今天突然碰到这种算法很神奇,记录一下~)
AC代码
#include<bits/stdc++.h>
#define mes(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
ll mod;
char n[maxn];
struct Mat{
ll mat[4][4];
Mat(){
mes(mat, 0);
}
void init(){
for(int i = 1; i <= 2; i++)
mat[i][i] = 1;
}
Mat operator * (const Mat &a)const{
Mat ans;
for(int i = 1; i <= 2; i++){
for(int j = 1; j <= 2; j++){
for(int k = 1; k <= 2; k++){
ans.mat[i][j] += mat[i][k]*a.mat[k][j]%mod;
ans.mat[i][j] %= mod;
}
}
}
return ans;
}
};
Mat pow(Mat a, ll b){
Mat ans;
ans.init();
while(b){
if(b&1)
ans = ans*a;
a = a*a;
b >>= 1;
}
return ans;
}
int main(){
ll a, b, x1, x0;
scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);
scanf("%s%lld",n, &mod);
int len = strlen(n);
Mat ans; ans.init();
Mat res;
res.mat[1][1] = a; res.mat[1][2] = b;
res.mat[2][1] = 1;
for(int i = len-1; i >= 0; i--){
ans = ans*pow(res, n[i]-'0');
res = pow(res, 10ll);
}
Mat f;
f.mat[1][1] = x1;
f.mat[2][1] = x0;
f = ans*f;
printf("%lld\n",f.mat[2][1]);
return 0;
}
2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化的更多相关文章
- 牛客多校第五场 B generator 1 矩阵快速幂
题意: 给定$x_0,x_1,a,b,n,mod, x_i=a*x_{i-1}+b*x_{i-2}$ ,求$x_n % mod$ n最大有1e6位 题解: 矩阵快速幂. 巨大的n并不是障碍,写一个十进 ...
- generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...
- 2019 牛客多校第五场 B generator 1
题目链接:https://ac.nowcoder.com/acm/contest/885/B 题目大意 略. 分析 十进制矩阵快速幂. 代码如下 #include <bits/stdc++.h& ...
- 2019牛客多校第五场C generator 2 hash,bsgs模板
generator 2 题意 给出\(x_0,a,b,p\),有方程\(x_i\equiv (a*x_{i-1}+b)(\% p)\),求最小的i,使得\(x_i=v\),不存在输出-1 分析 经过公 ...
- 2019牛客多校第五场B generator 十进制快速幂
generator 1 题意 给出\(x_0,x_1,a,b\)已知递推式\(x_i=a*x_{i-1}+b*x_{i-2}\),出个n和mod,求\(x_n\) (n特别大) 分析 比赛的时候失了智 ...
- 2019牛客多校第五场C generator 2(BSGS)题解
题意: 传送门 已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v ...
- 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...
- 2019牛客多校第五场generator2——BSGS&&手写Hash
题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...
- 2019牛客多校第五场F maximum clique 1 最大独立集
题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...
随机推荐
- SpringMvc的过滤器。
一:过滤器的原理: 过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet.一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请 ...
- SQL SERVER内部函数大全
SQL SERVER内部函数是SQL数据库中非常重要的一类函数,下面就为您介绍SQL SERVER内部函数,如果您对此方面感兴趣的话,不妨一看. SQL SERVER内部函数: select @@CO ...
- Python基础教程(016)--Python2和Python3的介绍
前言 Python2和Python3的区别 内容 Python3是现在和未来的主要版本 Python3没有考虑向下兼容. 官方提供了一个Python过度版本Python2.6 Python2.6及支持 ...
- paper 159:文章解读:From Facial Parts Responses to Face Detection: A Deep Learning Approach--2015ICCV
文章链接:https://arxiv.org/pdf/1509.06451.pdf 1.关于人脸检测的一些小小总结(Face Detection by Literature) (1)Multi-vie ...
- LOJ 2302 「NOI2017」整数——压位线段树
题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...
- [HDU3117]Fibonacci Numbers
题目:Fibonacci Numbers 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117 分析: 1)后四位可以用矩阵快速幂解决.$T= \left ...
- NOIp 数据结构专题总结 (2):分块、树状数组、线段树
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) 分块 阅:<「分块」数列分块入门 1-9 by hzwer> 树状数组 Binary Indexed T ...
- python 类和对象上
面向对象 Object Oriented 面向对象的学习: 面向对象的语法(简单,记忆就可以搞定) 面向对象的思想(稍难,需要一定的理解) 面向过程和面向对象的区别 面向过程开发,以函数作为基本结构使 ...
- vue 中router.go;router.push和router.replace的区别
vue 中router.go:router.push和router.replace的区别:https://blog.csdn.net/div_ma/article/details/79467165 t ...
- 3年Java,鏖战腾讯
作者:codegoose https://segmentfault.com/a/1190000017864721 经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次 ...