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个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...
随机推荐
- ceph-状态监测-脚本
http://www.tang-lei.com/2018/06/05/ceph-%E7%8A%B6%E6%80%81%E7%9B%91%E6%B5%8B-%E8%84%9A%E6%9C%AC/ 为了能 ...
- [信息学奥赛一本通oj1741]电子速度 题解
对于$100 \%$的数据,$1≤n,m≤1e6 \ \ \ 0<=x_i,y_i<20170927 \ \ \ 1≤l_i,r_i≤n $ $Solution:$ 一开始没看懂题.后来大 ...
- SPRING CLOUD微服务DEMO-下篇
目录 1 Hystix 1.1 简介 1.2 配置并测试 2. Feign 2.1 简介 2.2 使用Feign 2.3 负载均衡 2.4 Hystrix支持 2.5.请求压缩 3. Zuul网关 3 ...
- win7下使用cygwin编译VLC
win7下使用cygwin编译VLC http://kathy.blog.51cto.com/1168050/295460 2010-04-15 14:54:01 标签:编译 休闲 VLC 职场 w ...
- configure error libmcrypt was not found解决方法
安装到mcrypt的时候出现了问题./configure提示出错,首先提示*** Could not run libmcrypt test program, checking why-*** The ...
- 至强E3-1200 系列部分参数
1155 Xeon E3-1275V2(E1) Ivy Bridge 3.5GHz BLK 100MHz 8MB 77W All 1155* Xeon E3-1270V2(E1) Ivy Bridge ...
- GET and POST
有待补充:
- python Condition类(锁)
Condition(条件变量)通常与一个锁关联.需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例. 不理解锁的,请看上一条 ...
- Uncaught (in promise) DOMException谷歌浏览器js报错分析
Chrome的自动播放的政策在2018年4月做了更改,这点在开源中国的这篇文章中也有说到. 新的行为:浏览器为了提高用户体验,减少数据消耗,现在都在遵循autoplay政策,Chrome的autopl ...
- [LeetCode] 196.删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...