• 快速幂 + 矩阵快速幂


    快速幂    

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #define LL long long
     5 using namespace std;
     6 
     7 LL Pow(LL a, LL b)
     8 {
     9     LL ans = 1;
    10     while(b != 0){
    11         if(b&1)
    12             ans *= a;
    13         a *= a;
    14         b >>= 1;
    15     }
    16     return ans;
    17 }
    18 int main()
    19 {
    20     LL a, b;
    21     cin >> a >> b; 
    22     cout << Pow(a,b) << endl;
    23     return 0;
    24 }
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #define LL long long
     5 using namespace std;
     6 const LL mod = 1e9+7;
     7 
     8 LL Pow(LL a, LL b)
     9 {
    10     LL ans = 1;
    11     while(b != 0){
    12         if(b&1){
    13             ans *= a;
    14             ans %= mod;
    15         }
    16         a *= a;
    17         a %= mod;
    18         b >>= 1;
    19     }
    20     return ans;
    21 }
    22 int main()
    23 {
    24     LL a, b;
    25     cin >> a >> b; 
    26     cout << Pow(a,b) << endl;
    27     return 0;
    28 }

    矩阵快速幂

       模板! (自己敲了一遍 只是感觉有些乱 就把ff的记上

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 typedef long long LL;
     7 const int N = 105;
     8 const LL mod = 1e9 + 7;
     9 LL n, m;
    10 struct mac {
    11     LL c[N][N];
    12     void reset() {
    13         memset(c, 0, sizeof(c));
    14         for (int i = 1; i <= n; i++)
    15             c[i][i] = 1;
    16     }
    17 };
    18 mac multi(mac a, mac b) 
    19 {
    20     mac ans;
    21     for (int i = 1; i <= n; i++)
    22         for (int j = 1; j <= n; j++) {
    23             ans.c[i][j] = 0;
    24             for (int k = 1; k <= n; k++) {
    25                 ans.c[i][j] += (a.c[i][k] * b.c[k][j]) % mod;
    26                 ans.c[i][j] %= mod;
    27             }
    28         }
    29     return ans;
    30 }
    31 mac Pow(mac a, LL b) 
    32 {
    33     mac ans; ans.reset();
    34     while (b) {
    35         if (b & 1) 
    36             ans = multi(ans, a);
    37         a = multi(a, a);
    38         b >>= 1;
    39     }
    40     return ans;
    41 }
    42 int main()
    43 {
    44     ios::sync_with_stdio(false);
    45     while (cin >> n >> m) {
    46         mac a;
    47         for (int i = 1; i <= n; i++)
    48             for (int j = 1; j <= n; j++)
    49                 cin >> a.c[i][j];
    50         a = Pow(a, m);
    51         for (int i = 1; i <= n; i++) {
    52             for (int j = 1; j < n; j++)
    53                 cout << a.c[i][j] << " ";
    54             cout << a.c[i][n] << endl;
    55         }
    56     }
    57     return 0;
    58 }

    [应用](矩阵快速幂

    4267: 二元数列

    时间限制: 1 Sec  内存限制: 128 MB

    题目描述

    已知:


    输入x0,y0,a,b,c,d,n
    输出xn,yn对20181225取模的结果

    输入

    输入x0,y0,a,b,c,d,n

    输出

    输出xn,yn对20181225取模的结果

    样例输入

    7 6 5 4 3 2 1

    样例输出

    59 33

    提示

    0<=x0,y0,a,b,c,d<=1e3

    0<=n<=8e8

    解:虽然我此时此刻很想打死旁边的猪 可是不得不承认这个题 ,是他教的

           先推出 Xn+1 = (a²+bc)Xn-1 + (ab+bd)Yn-1;

               Yn+1 = (ac+cd)Xn-1 + (bc+d²)Yn-1;        取系数为一个矩阵,你就会发现系数是由Xn Yn系数的平方求来的, 然后推推就知道  题目求是一个矩阵的n次方  由于n太大,所以采用矩阵快速幂来求出最后Xn Yn的系数,最后求得答案。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #define LL long long
     5 using namespace std;
     6 const LL mod = 20181225;
     7 struct node{
     8     LL m[2][2];
     9     void reset(){
    10         memset(m,0,sizeof(m));
    11         m[0][0] = 1;
    12         m[1][1] = 1;
    13     }
    14 };
    15 LL xx, yy, a, b, c, d, n, x, y;
    16 
    17 node multi(node a, node b)
    18 {
    19     node ans; ans.reset();
    20     ans.m[0][0] = 0; ans.m[1][1] = 0;
    21     for(int i = 0; i < 2; i++)
    22         for(int j = 0; j < 2; j++)
    23             for(int k = 0; k < 2; k++){
    24             ans.m[i][j] += (a.m[i][k] * b.m[k][j]) % mod;
    25             ans.m[i][j] %= mod;
    26     }
    27     return ans;
    28 }
    29 node Pow(node a, LL b)
    30 {
    31     node ans; ans.reset();
    32     while(b){
    33         if(b & 1)
    34             ans = multi(ans, a);
    35         a = multi(a, a);
    36         b >>= 1;
    37     }
    38     return ans;
    39 }
    40 int main()
    41 {
    42     node may;
    43     while(cin >> xx >> yy >> a >> b >> c >> d >> n){
    44         may.m[0][0] = a; may.m[0][1] = b;
    45         may.m[1][0] = c; may.m[1][1] = d;
    46         may = Pow(may,n);
    47         x = (may.m[0][0] * xx + may.m[0][1] * yy) % mod;
    48         y = (may.m[1][0] * xx + may.m[1][1] * yy) % mod;
    49         cout << x << " " << y << endl;
    50     }
    51     return 0;
    52

    [后记]   啦啦啦 这是我的第一篇博客,写给自己看的博客, 以后要找些什么也会方便很多! 做个总结。希望这十分钟不是浪费,加油鸭 小菜鸟 哈哈哈哈哈  虽然我感觉8 这条道路上的大佬超级多,但是! 好像不是但是,我是一个比较容易放弃的人哈哈哈 也可以记录一下生活呀 什么的 对伐! 耶  悄咪咪的

  • 相关阅读:
    SSL安全证书配置
    TQ2440使用定时器产生PWM,控制蜂鸣器发声
    图像处理基本算法比特分层
    ARM学习TQ2440
    图像处理基本算法
    TQ2440按键
    linux下与TQ2440进行串口通信
    图像处理基本算法直方图均衡
    大小写字母转换汇编
    linux下使用DNW下载镜像TQ2440
  • 原文地址:https://www.cnblogs.com/JiaaaaKe/p/9449880.html
Copyright © 2020-2023  润新知