题意:

给定$x_0,x_1,a,b,n,mod, x_i=a*x_{i-1}+b*x_{i-2}$ ,求$x_n % mod$

n最大有1e6

题解:

矩阵快速幂。

巨大的n并不是障碍,写一个十进制的矩阵快速幂就行了。

$ \begin{bmatrix}x_n \\ x_{n-1} \end{bmatrix}=\begin{bmatrix}a &b \\ 1 &0 \end{bmatrix} *\begin{bmatrix}x_{n-1} \\ x_{n-2} \end{bmatrix}=\begin{bmatrix}a &b \\ 1 &0 \end{bmatrix}^{n-1}\begin{bmatrix}x_1 \\ x_0 \end{bmatrix} $

#include<iostream>
#include<cstring>
#include<cassert>
#define LL long long
using namespace std;
LL mod;
struct Mtx{
LL x[][];
friend Mtx operator *(const Mtx &a,const Mtx &b){
Mtx c;
LL tmp00=a.x[][]*b.x[][] % mod+a.x[][]*b.x[][] % mod;
LL tmp01=a.x[][]*b.x[][] % mod+a.x[][]*b.x[][] % mod;
LL tmp10=a.x[][]*b.x[][] % mod+a.x[][]*b.x[][] % mod;
LL tmp11=a.x[][]*b.x[][] % mod+a.x[][]*b.x[][] % mod;
assert(tmp00>=);
assert(tmp01>=);
assert(tmp10>=);
assert(tmp11>=);
c.x[][]=tmp00 % mod;
c.x[][]=tmp01 % mod;
c.x[][]=tmp10 % mod;
c.x[][]=tmp11 % mod;
return c;
}
friend Mtx operator ^ (Mtx base,int n){
Mtx ans=Mtx();
while(n){
if(n%){
ans=ans*base;
}
base=base*base;
n>>=;
}
return ans;
}
Mtx(){}
Mtx(int a){
x[][]=;
x[][]=;
x[][]=;
x[][]=;
}
};
char n[];
int main(){
LL x0,x1,a,b;
scanf("%lld %lld %lld %lld",&x0,&x1,&a,&b);
scanf("%s",n);
scanf("%lld",&mod);
int len=strlen(n);
int kk=len-;
Mtx ans=Mtx();
Mtx base;
if(len==){
if(n[]==''){
printf("%lld\n",x0%mod);
goto E;
}
if(n[]==''){
printf("%lld\n",x1%mod);
goto E;
}
} while(){
n[kk]--;
if(n[kk]<''){
n[kk]+=;
kk--;
}else break;
}
// printf("%s\n",n);
base.x[][]=a;
base.x[][]=b;
base.x[][]=;
base.x[][]=;
for(int i=;i<len;i++){
ans=ans^;
ans=ans*(base^(n[i]-''));
}
printf("%lld\n",(x1*ans.x[][]+x0*ans.x[][])%mod); E:return ;
}

小贴士:矩阵快速幂,以及一些其他的,比较复杂的,比较套路的东西,一定要封装好,这样在不太损失效率的前提下最大限度的保证了代码的可读性,这是我某次打cf时wa到自闭的教训。

8月6日PS:这种概念叫做DRY原则,全称是Don't repeat yourself.今天刚学到的名词。

牛客多校第五场 B generator 1 矩阵快速幂的更多相关文章

  1. 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}\) 思路 一般看 ...

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

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

  3. 十进制快速幂(牛客多校第五场)-- generator 1

    思路: 十进制快速幂. #include <stdio.h>//sprintf #include <cstdlib>////malloc exit strcat itoa sy ...

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

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

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

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

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

  8. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  9. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

随机推荐

  1. Python学习笔记(八)——正则表达式

    正则表达式 \d表示匹配一个数字 例如,1\d\d可以匹配以1开头的三位数字 \w可以匹配一个字母或者数字 例如,\d\w可以匹配12,1A等 .可以匹配任意字符 例如,py.表示pyc.pya等 * ...

  2. mysqld_safe A mysqld process already exists

    最近修改mysql密码遇到mysqld_safe A mysqld process already exists问题: 解决步骤: 1:ps aux |grep mysql   查看mysql的进程. ...

  3. JS实现菜单滚动到一定高度后固定

    在有些网页中我们会发现会有这样的现象:某个div会随着屏幕的滚动达到一定高度的时候位置就固定下来了.例如一下导航条: 那么这里就需要用到JS的逻辑方法来实现了. html <div id=&qu ...

  4. thinkphp 缓存驱动

    缓存驱动默认位于Think\Cache\Driver命名空间下面,目前已经提供了包括APC.Db.Memcache.Shmop.Sqlite.Redis.Eaccelerator和Xcache缓存方式 ...

  5. js实现canvas保存图片为png格式并下载到本地

    canvas 保存图片 下载到本地 function base64Img2Blob(code){ var parts = code.split(';base64,'); var contentType ...

  6. NX二次开发-UFUN获取球的参数UF_MODL_ask_sphere_parms

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize( ...

  7. NX二次开发-UFUN创建倒角UF_MODL_create_chamfer

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN S ...

  8. NX二次开发-NXString转换为char*方法

    NX9+VS2012 #include <uf.h> #include <uf_drf.h> #include <NXOpen/Annotations_Note.hxx& ...

  9. npm run 同时执行多个命令

    在项目中可能需要一套代码同时部署几套环境,每一次改动就需要同时打包N次.这时就需要能够一个命令同时打包多次,省去了很多麻烦. 这里我们需要用到 concurrently 这个 npm 包,能够实现我们 ...

  10. Golang 交叉编译跨平台的可执行程序 (Mac、Linux、Windows )

    起因: 在项目中,我们每一次提交都需要添加commit 信息,而且我们的commit 信息,比较繁琐.我决定用golang语言编写一个小工具. 我决定使用语言:golang,使用工具:gox包. go ...