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个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ... 
随机推荐
- 高精度乘法模板(luogu1303)
			洛谷1303 //luogu1303,不压位的高精度乘法 #include <cstdio> #include <iostream> using namespace std; ... 
- webpack对脚本和样式的处理
			一.对js处理 webpack本身支持js加载也可以用插件. 1.加载要全局使用的插件比如jquery 在页面用cdn方式引用,然后再webpack.config.js里配置.会让jquery成为全局 ... 
- XenServer(服务器虚拟化平台)
			Citrix Xenserver,思杰基于Xen的虚拟化服务器.Citrix XenServer是一种全面而易于管理的服务器虚拟化平台,基于强大的 Xen Hypervisor 程序之上.Xen技术被 ... 
- 在CentOS上部署kubernetes1.9.0集群
			原文链接: https://jimmysong.io/kubernetes-handbook/cloud-native/play-with-kubernetes.html (在CentOS上部署kub ... 
- kvm动态修改内存和cpu
			https://www.cnblogs.com/nmap/p/6369180.html 
- appium定位学习
			前面也介绍过appium的一些定位方法,今天看到一篇博客,里面的方法总结的,就转载过来. 本文转自:https://www.cnblogs.com/Mushishi_xu/p/7685966.html ... 
- spring controller使用了@ResponseBody却返回xml
			使用ajax请求数据 $.ajax({ url:message.rootPath +"/sendMessage.xhtml", type:"post", dat ... 
- VB - sendKey
			Set WshShell=WScript.CreateObject("WScript.Shell") WshShell = SendKeys string “string”:表示要 ... 
- maven(一),maven3.5.3的windows安装及Eclipse集成
			maven用了好长时间,需要系统的学习一下.maven ,是一个项目构建的工具,是一个项目管理和综合工具,具有项目生命周期管理功能. maven现在到了3.5.3,就以这个版本进行. 一.下载mave ... 
- Scrapy框架: Request回调函数
			Request回调函数 def parse_page1(self, response): return scrapy.Request("http://www.example.com/some ... 
