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}x_{n+1} \\x_{n}\end{pmatrix}=
\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 矩阵快速幂+十倍增+二进制倍增优化的更多相关文章

  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并不是障碍,写一个十进 ...

  2. generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

  3. 2019 牛客多校第五场 B generator 1

    题目链接:https://ac.nowcoder.com/acm/contest/885/B 题目大意 略. 分析 十进制矩阵快速幂. 代码如下 #include <bits/stdc++.h& ...

  4. 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 分析 经过公 ...

  5. 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特别大) 分析 比赛的时候失了智 ...

  6. 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 ...

  7. 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂

    理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...

  8. 2019牛客多校第五场generator2——BSGS&&手写Hash

    题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...

  9. 2019牛客多校第五场F maximum clique 1 最大独立集

    题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...

随机推荐

  1. POJ 2114 (点分治)

    题目:https://vjudge.net/contest/307753#problem/B 题意:求树中路径和=k的点对是否存在 思路:点分治,这个题其实和上一题洛谷一样,只是这个数据强,我们不能直 ...

  2. error MSB8008: 指定的平台工具集(v110)未安装或无效

    转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...

  3. 0.tensorflow——常用说明

    1.tf tf.placeholder(tf.float32,shape=[None,inputSize])#类似于一个float32的声明 tf.reduce_mean()#求均值,可以是不同维度 ...

  4. 关系型数据库MySQL(二)_索引

    优点 大大加快数据的查询速度 创建唯一性索引,保证数据库表中每一行数据的唯一性 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 缺点 索引需要占物理空间 当对表中的数据进行增删 ...

  5. Jquery中input:type=radio的监听,获取设置值

    一.html <div id='demo'> <input type='radio' name='sex' value='男' > <input type='radio' ...

  6. Java原理领悟-线程池(Executor)

    线程池全面解析 什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我 ...

  7. 使用VS 2019发布.net core程序并部署到IIS的最新教程

    不管你是使用.net core开发的是web api还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.net core程序部署到IIS的朋友,可以看看这篇手把手教你部署.net ...

  8. android ListView列表显示数据

    item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...

  9. document.location window.location

    document.location 和 window.location 取url的值的时候可以通用,但是 document是window的属性,所以不能直接用document.location =ur ...

  10. JAVA金额格式字符串转数值

    项目中有时会遇到对金额格式的数值如“1,234.34567”进行计算,直接使用Double.parseDouble(“1,234.34567”)会抛出NumberFormatException异常, ...