[关闭]
@zhangche0526 2017-02-25T06:32:55.000000Z 字数 957 阅读 982

快速幂及矩阵

基础快速幂

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. typedef long long ll;
  5. int qpow(int a,int b,int mod)
  6. {
  7. int res=1;
  8. for(ll i=1;i<=b;i<<=1,a=((ll)a*a)%mod)
  9. if(i&b)res=((ll)res*a)%mod;
  10. return res;
  11. }
  12. int main()
  13. {
  14. ll b, p, k;
  15. cin>>b>>p>>k;
  16. cout<<b<<"^"<<p<<" mod "<<k<<"="<<qpow(b,p,k);
  17. return 0;
  18. }

矩阵快速幂

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int P=1e9+7;
  5. typedef long long ll;
  6. struct matrix
  7. {
  8. int s[2][2];
  9. };
  10. matrix mul(matrix a, matrix b)
  11. {
  12. matrix ans;
  13. int i,j,k;
  14. for(i = 0; i < 2; i ++)
  15. for(j = 0; j < 2; j ++)
  16. for(k = 0; k < 2; k ++)
  17. ans.s[i][j]=((ll)ans.s[i][j] + (ll)(a.s[i][k] * b.s[k][j]) % P) % P;
  18. return ans;
  19. }
  20. matrix power(matrix a, int n)
  21. {
  22. matrix im;//单位矩阵
  23. im.s[0][0] = im.s[1][1] = 1;
  24. im.s[1][0] = im.s[0][1] = 0;
  25. matrix b = a;
  26. for(int i = 1; i <= n; i <<= 1, b = mul(b, b))
  27. if(n & i) im = mul(im, b);
  28. return im;
  29. }

应用:求斐波那契数列

  1. int F(int n)
  2. {
  3. if (n == 0) return 1 % P;
  4. else if(n == 1) return 1 % P;
  5. else
  6. {
  7. matrix a;
  8. a.s[0][0] = a.s[0][1] = a.s[1][0] = 1;
  9. a.s[1][1] = 0;
  10. a = power(a, n - 2);
  11. int f = (long long) (a.s[0][0] + a.s[0][1]) % P;
  12. return f;
  13. }
  14. }
  15. int main()
  16. {
  17. int n;
  18. scanf("%d", & n);
  19. cout << F(n) << endl;
  20. return 0;
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注