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. Python爬虫之抓图

    从"百度图片(http://image.baidu.com/)"的首页下载图片 # -*- coding: utf-8 -*- import urllib import re im ...

  2. 【Java】Java引用maven私服jar包及jar包提交私服问题

    pom.xml中加入以下配置即可 1.引用私服jar包 <!-- 加载的是 第三方项目使用的jar包 --> <repositories> <repository> ...

  3. 【CF1210D】Konrad and Company Evaluation(vector,图论)

    题意:有i个人,m对两两之间的关系,第i个人初始的薪水为i,有q次操作,第i次操作会把v[i]号的薪水提升成n+i 如果两个人之间存在关系,薪水高的会向薪水低的炫耀 定义u,v,w为一个三元组,当u向 ...

  4. BottomNavigationBar 自定义 底部导航条

    在flutter中,BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数. BottomNav ...

  5. JAVA 大数开方模板

    JAVA 大数开方模板 import java.math.BigInteger; import java.math.*; import java.math.BigInteger; import jav ...

  6. English-spoken

    May i come in? 我可以进来么? May I introduce myself? 我能做个自我介绍么? I'm sorry I didn't hear that clearly. May ...

  7. Linux启动详细过程(开机启动顺序)

    启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...

  8. Spring Cloud的简单介绍

    参考地址: https://mp.weixin.qq.com/s/wG4CTLORnvemkjUsZ7YP6Q 从一个例子开始 对于这样的"大"问题,通常需要拆解成小问题来回答.要 ...

  9. C语言博客作业12

    一.我学到的内容 二.我的收获 * https://www.cnblogs.com/asd123456/ * 我的收获:通过这一个学期的学习,我一共完成了11次作业,由最开始的第一次作业https:/ ...

  10. Action.c(28): Error -27796: Failed to connect to server "xxxx": [10060] Connection timed out

    Error -27796: Failed to connect to server "125.93.51.230:8080": [10061] Connection refused ...