题意:

给定$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.今天刚学到的名词。

最新文章

  1. PHP浅复制与深复制
  2. 分享一段数据库中表数据更新SQL
  3. (2)从实际项目谈起,基于MEF的插件框架之总体设计
  4. Hibernate反向工程在javaweb下的操作配置
  5. tomcat域名访问配置
  6. 扩展SharePoint链接字段
  7. HTTP 笔记与总结(3 )socket 编程:发送 GET 请求
  8. Python数据库连接池实例——PooledDB
  9. xml、xhtml、html、dhtml的区别
  10. 自定义cell 自适应高度
  11. java疯狂演义----简单java IDE工具
  12. EF CodeFirst使用MySql
  13. 关于Allele(等位基因)的理解
  14. CentOS7基本配置一
  15. 安装rlwrap 的简单方法
  16. archlinux 64bit 开发android
  17. TensorFlow神经网络中的激活函数
  18. 基于Vue的SPA如何优化页面加载速度
  19. tornado获取application/json类型的入参
  20. 【转】UGUI VS NGUI

热门文章

  1. 数组去重Set也可实现
  2. 初识webSocket及其使用
  3. 字符串利用%02d将月份前加0
  4. 伪类元素before&amp;after
  5. JavaScript: 变量提升和函数提升
  6. SQL Server SQLBindCol
  7. DOM——节点操作
  8. 关于移动端使用swiper做图片文字轮播的思考
  9. POJ2406-Power Strings-KMP循环节/哈希循环节
  10. solr添加IK分词和自己定义词库