题目链接:https://ac.nowcoder.com/acm/contest/885/B

题意:已知齐次线性式xn=a*xn-1+b*xn-2,已知a,b,x0,x1,求xn,n很大,n<=1010^6.

思路:矩阵快速幂模板题,构造矩阵t:

  1. a b

   矩阵ans:

  1. x1
  2. x0

   显然ans1=t×ans,ans1为:

  1. x2
  2. x1

   那么ansn=t^n*ans,ansn为:

  1. xn+
  2. xn

   所以用矩阵快速幂计算t^n,n很大,快速幂要用十进制倍增,对每一位的计算不能直接乘,还要用二进制的快速幂,不然会TLE。

   最近写代码像中邪了一样,照着别人的代码写总会有个小地方写错,然后找一天的错误,连续几天了。

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. typedef long long LL;
  7. LL x0,x1,a,b;
  8. int MOD;
  9. char s[1000005];
  10.  
  11. struct Matrix{
  12. LL a[2][2];
  13. Matrix(){memset(a,0,sizeof(a));}
  14. Matrix operator * (const Matrix y){
  15. Matrix ret;
  16. for(int i=0;i<2;++i)
  17. for(int j=0;j<2;++j)
  18. for(int k=0;k<2;++k)
  19. ret.a[i][j]=(ret.a[i][j]+a[i][k]*y.a[k][j])%MOD;
  20. return ret;
  21. }
  22. void operator = (const Matrix y){
  23. for(int i=0;i<2;++i)
  24. for(int j=0;j<2;++j)
  25. a[i][j]=y.a[i][j];
  26. }
  27. }tmp;
  28.  
  29. Matrix qpow2(Matrix m,int b){
  30. Matrix ret=tmp;
  31. ret.a[0][0]=ret.a[1][1]=1;
  32. while(b){
  33. if(b&1) ret=ret*m;
  34. m=m*m;
  35. b>>=1;
  36. }
  37. return ret;
  38. }
  39.  
  40. Matrix qpow10(Matrix m,char *s){
  41. Matrix ret=tmp;
  42. ret.a[0][0]=ret.a[1][1]=1;
  43. for(int i=strlen(s)-1;i>=0;--i){
  44. int num=s[i]-'0';
  45. ret=ret*qpow2(m,num);
  46. m=qpow2(m,10);
  47. }
  48. return ret;
  49. }
  50.  
  51. int main(){
  52. scanf("%lld%lld%lld%lld",&x0,&x1,&a,&b);
  53. scanf("%s%d",s,&MOD);
  54. Matrix t,ans;
  55. t.a[0][0]=a,t.a[0][1]=b,t.a[1][0]=1,t.a[1][1]=0;
  56. ans.a[0][0]=x1,ans.a[0][1]=0,ans.a[1][0]=x0,ans.a[1][1]=1;
  57. t=qpow10(t,s);
  58. ans=t*ans;
  59. printf("%lld\n",ans.a[1][0]);
  60. return 0;
  61. }

2019牛客暑期多校训练营(第五场)- B generator 1 (齐次线性递推+矩阵快速幂)的更多相关文章

  1. 2019牛客暑期多校训练营(第五场) maximum clique 1

    题意:给出n个不相同的数,问选出尽量多的数且任两个数字二进制下不同位数大于等于2. 解法:能想到大于等于2反向思考的话,不难发现这是一个二分图,那么根据原图的最大团等于补图的最大独立点集,此问题就变成 ...

  2. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  3. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  4. 2019牛客暑期多校训练营(第一场) B Integration (数学)

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

  5. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

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

  6. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  7. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  8. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

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

  9. 2019牛客暑期多校训练营(第九场)B Quadratic equation (平方剩余)

    \((x+y)\equiv b\pmod p\) \((x\times y)\equiv c\pmod p\) 由第一个式子可知:\(x+y=b~or~x+y=b+p\) 先任选一个代入到第二个式子里 ...

  10. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

随机推荐

  1. The Reset Method of Te Philips VTR 5210

    Pull down and hold the ON/OFF buttun, Then press the play button

  2. c/c++读取一行可以包含空格的字符串(getline,fgets用法)

    1.char[]型 char buf[1000005]; cin.getline(buf,sizeof(buf)); 多行文件输入的情况: while(cin.getline(buf,sizeof(b ...

  3. 【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  4. docker-compose部署微服务

    1.安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose ...

  5. 提交本地文件至gitlab已有的项目中(更新gitlab)

    gitlab代码更新 gitlab官网 1.安装git git官网 官网下载安装,安装过程一直next即可(路径自己选) 2.clone至本机 格式:git clone url(可转到指定目录克隆) ...

  6. 打印li索引值

    <ul> <li>这是第一条alert(0)</li> <li>这是第二条alert(1)</li> <li>这是第三条aler ...

  7. 树形dp(灯与街道)

    https://cn.vjudge.net/contest/260665#problem/E 题意: 给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮.每盏灯将照亮以它为一个 ...

  8. kotlin array

    (1)Kotlin语言使用Array表示数组. (2)[] 可以用于访问数组的元素, [] 被进行了操作符的重载,调用的是 Array 类的 setter 和 getter 方法 2.创建数组 (1) ...

  9. python异常值检验实战2_医美手术价格

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  10. Faster R-CNN论文阅读摘要

    论文链接: https://arxiv.org/pdf/1506.01497.pdf 代码下载: https://github.com/ShaoqingRen/faster_rcnn (MATLAB) ...