题目

已知 $x_i = ax_i + bx_{i-1}$,求 $x_n \% MOD$.($1\leq n\leq 10^{(10^6)}$)

分析

写成矩阵快速幂的形式,相当于求转移矩阵的 $n$ 次幂。

由于 $n$ 过大,只能用字符串形式保存,如果转成二进制复杂度过高,就直接用十进制好了。

其实十进制快速幂和二进制几乎一样,都是倍增的思想。

  1. ll qpow(ll a, ll b, ll p)
  2. {
  3. ll ret = ;
  4. while(b)
  5. {
  6. if(b&) ret = ret*a%p;
  7. a = a*a%p;
  8. b >>= ;
  9. }
  10. return ret;
  11. }
  12.  
  13. inline ll shi_pow(ll a, ll b, ll p)
  14. {
  15. ll ret = ;
  16. while(b)
  17. {
  18. ll yu = b%;
  19. if(yu) ret = ret*qpow(a,yu,p)%p;
  20. a = qpow(a, , p);
  21. b /= ;
  22. }
  23. return ret;
  24. }

二进制更快,里面能用二进制的换成了二进制。

回到题目,将字符串 $n$ 从高到低就是十进制,与上面类似

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. const int N=+;
  6. ll x0,x1,a,b,mod;
  7. char s[N];
  8.  
  9. struct Mat{
  10. int r,c;
  11. ll m[][];
  12. Mat(){
  13. //memset(m,0,sizeof(m));
  14. for(int i = ;i < ;i++)
  15. for(int j = ;j < ;j++)
  16. m[i][j]=;
  17. }
  18. };
  19.  
  20. inline Mat mmul(Mat x,Mat y,ll p){
  21. Mat ans;
  22. ans.r=x.r;
  23. ans.c=y.c;
  24. for(int i=;i<x.r;i++)
  25. for(int k=;k<x.c;k++)
  26. for(int j=;j<y.c;j++){
  27. ans.m[i][j] = (ans.m[i][j] + x.m[i][k]*y.m[k][j])%p;
  28. }
  29. return ans;
  30. }
  31.  
  32. inline Mat mpow(Mat x,ll y,ll p){
  33. Mat ans;
  34. ans.r=x.r;
  35. ans.c=x.c;
  36. for(int i=;i<ans.c;i++) ans.m[i][i]=;
  37. while(y){
  38. if(y&) ans=mmul(ans,x,p);
  39. x=mmul(x,x,p);
  40. y>>=;
  41. }
  42. return ans;
  43. }
  44.  
  45. inline Mat m_shi_pow(Mat x,char* s,ll p){
  46. Mat ans;
  47. ans.r=x.r;
  48. ans.c=x.c;
  49. int len = strlen(s);
  50. for(int i=;i<ans.c;i++) ans.m[i][i]=;
  51. while(len--){
  52. int yu = (s[len]-''); //printf("yu:%d\n", yu);
  53. if(yu) ans=mmul(ans,mpow(x, yu, p),p);
  54. x=mpow(x,,p);
  55. }
  56. return ans;
  57. }
  58.  
  59. int main(){
  60. scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);
  61. scanf("%s%lld", s, &mod);
  62. Mat A,T;
  63. A.r=; A.c=;
  64. A.m[][]=x1; A.m[][]=x0;
  65. T.r=; T.c=;
  66. T.m[][]=a; T.m[][]=b; T.m[][]=; T.m[][]=;
  67. T = m_shi_pow(T, s, mod);
  68. A = mmul(T, A, mod);
  69. printf("%lld\n", A.m[][]);
  70.  
  71. return ;
  72. }

这题有点卡常,加些常数优化才抖过去。

2019牛客多校B generator 1——十进制快速幂的更多相关文章

  1. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  2. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  3. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  4. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

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

  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牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  8. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  9. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

随机推荐

  1. IntelliJ IDEA 联想代码

  2. Tomcat部署WEB应用方式

    罗列在Tomcat部署web应用的几种方法,供以后翻阅,本博文以helloapp应用为例 Tomcat目录介绍 简单目录介绍如下 bin目录:包含tomcat启动/关闭等脚本,支持linux.wind ...

  3. [转帖]Pivotal Greenplum 6.0 新特性介绍

    Pivotal Greenplum 6.0 新特性介绍 https://cloud.tencent.com/developer/news/391063 原来 greenplum 也是基于pg研发的. ...

  4. sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解

    介绍了sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解 --服务器角色: --固定服务器角色具有一组固定的权限,并且适用于整个服务器范围. 它们专门用于管理 SQL S ...

  5. 【51nod】1602 矩阵方程的解

    [51nod]1602 矩阵方程的解 这个行向量显然就是莫比乌斯函数啦,好蠢的隐藏方法= = 然后我们尝试二分,二分的话要求一个这个东西 \(H(n) = \sum_{i = 1}^{n} \mu(i ...

  6. ARTS 第十周打卡

    Algorithm : 做一个 leetcode 的算法题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

  7. MongoDB 逻辑运算符

    逻辑与   $and:要求满足所有查询条件 ,否则返回空 语法:db.集合名.find{ $and: [ { <expression1> }, { <expression2>  ...

  8. Solr综合案例深入练习

    1. 综合案例 1.1. 需求 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字.分类.价格搜索商品信息,也可以根据价格进行排序,并且实现分页功能. 界面如下: 1.2. 分析 开发人员需要 ...

  9. 在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串)

    原文:在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方 ...

  10. .netcore 和.netFrameWork

    netcore 是一个流程,可以调用,netcore 框架下,选择netFrameWork.可以使用netFrameWork的库,比如画图等.只是管道是netcore的.