题意:

已知 \(X_i = a * X_{i - 1} + b * X_{i - 2}\),现给定\(X_0,X_1,a,b\),询问\(X^n \mod p\),其中\(n <= 10^{1e6}\)

思路:

显然这道题需要用到矩阵快速幂,但是因为\(n\)是百万位级别,直接快速幂复杂度为\(1e6 * log10 * 4 * C1\),超时。

所以我们可以用十进制矩阵快速幂,和二进制类似,复杂度为\(1e6 * 4 * C2\)。因为这里的\(n\)比较大,所以\(C2 < log10 * C1\)大概率发生。

代码:

#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 11;
const int MOD = 1e9 + 7;
using namespace std;
char s[maxn];
ll x0, x1, a, b, mod;
struct Mat{
ll s[2][2];
void init(){
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
s[i][j] = 0;
}
};
inline Mat pmul(Mat a, Mat b){
Mat t;
t.init();
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
for(int k = 0; k < 2; k++){
t.s[i][j] = (t.s[i][j] + a.s[i][k] * b.s[k][j]) % mod;
}
}
}
return t;
}
inline Mat ppow(Mat a, int b){
Mat ret;
ret.init();
for(int i = 0; i < 2; i++) ret.s[i][i] = 1;
while(b){
if(b & 1) ret = pmul(ret, a);
a = pmul(a, a);
b >>= 1;
}
return ret;
}
inline Mat power(Mat a, char *s, int n){
Mat ret;
ret.init();
for(int i = 0; i < 2; i++) ret.s[i][i] = 1;
for(int i = n; i >= 1; i--){
int x = s[i] - '0';
if(x) ret = pmul(ret, ppow(a, x));
a = ppow(a, 10);
}
return ret;
}
int main(){
scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);
scanf("%s%lld", s + 1, &mod);
int n = strlen(s + 1);
Mat ans, t;
ans.init();
ans.s[0][0] = x1, ans.s[0][1] = x0;
t.s[0][0] = a, t.s[0][1] = 1, t.s[1][0] = b, t.s[1][1] = 0;
t = power(t, s, n);
ans = pmul(ans, t);
printf("%lld\n", ans.s[0][1]);
return 0;
}

最新文章

  1. UE4 中Struct Emum 类型的定义方式 笔记
  2. Xocde4与Xcode3的模板比较
  3. 【C语言学习】《C Primer Plus》第8章 字符输入/输出和输入确认
  4. MySQL数据库出现The server quit without updating PID file.
  5. 【python】format函数格式化字符串的用法
  6. General Questions:Front-end Developer Interview Questions
  7. 实现简单的cp命令
  8. 从医生看病和快餐店点餐理解Node.js的事件驱动
  9. HDU2697+DP
  10. 关于新的man版本出现“无法解析 /usr/share/man/zh_CN/man1/ls.1.gz: 没有那个文件或目录“
  11. 遇到java.lang.OutOfMemoryError: Java heap space问题【持续跟踪中...】
  12. 排序算法源码(JAVA)
  13. JS--Div中数据滚动到最后一条重新从头开始滚动
  14. ElasticSearch Aggregation
  15. 关于android:id=&quot;@+id/xx&quot;的理解
  16. URL中特殊符号的处理
  17. 给大家推荐一个C#下文件监听器和资源管理器的示例Demo-含源码
  18. Java之旅_高级教程_URL处理
  19. ionic后台返回的数据是html模板的时候,解析html文件的方法:
  20. 【SpringAop】【统一日志处理】注解方式理解以及使用

热门文章

  1. ABP vNext 实现租户Id自动赋值插入
  2. 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
  3. 干货!上古神器 sed 教程详解,小白也能看的懂
  4. 【链表】leetcode-1290-二进制链表转整数
  5. 登陆的时候出现javax.xml.bind.DatatypeConverter错误
  6. 日志采集技术分析 Inode Inotify
  7. shiro的授权与认证
  8. ElasticSearch基本简介(一)
  9. HDU1814和平委员会
  10. Eclipse+Maven+Spring