233 matrix

题源:Problem - 5015 (hdu.edu.cn)

题意

     给出第一行的规律 a00,a01,a02, , , , a0m = 0,233,2333,23333 ,,,,

     第一列的数input给出 a00, a10, a20 , a30, ,,, an0 = 0, a1,a2 ,a3,a4,,,,an

     第 aij 为 ai-1,j + ai, j-1 , 求 an,m

规律总结

    把矩阵看作一列一列的找规律

    可以发现第 j 列 可以很容易通过第 j-1 列 相加推导得出, 除去第一行有些不对称

    第一行分别为 0,233,2333,23333 ,可以将第一个改为23,则 ai= ai-1*10 +3 。 

一般快速幂

    当计算 a ^n 时,例如 12345 ^255  ,需要进行 255次乘法,时间复杂度 O(n)

   可以将时间复杂度降到 O(log n ) 

    方法是 255 = 111111112

    可以将 12345^255 = 12345 ^(2^7*1+2^6*1+ 2*5*1+ + 2^0*1)

                                   = 12345^(2^7) * 12345* (2^6)* *** 12345^(2^0)

     时间复杂度降为项为1的个数和最高次幂的位数 ,8^7  时间复杂度  O(log n*log n)

给出算法

复制代码
int QuickPower(int a,int n){
    //return a^n
    int ret = 1;
    int tem = a;
    while(n){
        if(n&1)
            ret *= tem;
        tem *= tem;
        n>>=1;
    }
    return ret;
}
复制代码

 

 

矩阵快速幕

   

将乘法变成矩阵乘法,给出模板。

 

给出算法模板:

    

复制代码
const int N = 100;
struct Mat
{
    int m[N][N];
} ans, res; //res result

Mat Mul(Mat a, Mat b,int n){
    //定义矩阵的乘法
    Mat ret;
    for (int i = 0; i < n;i++)
        for (int j = 0; j < n; j++)
            ret.m[i][j] = 0;

    for (int i = 0; i < n;i++)
        for (int j = 0; j < n;j++)
            for (int k = 0; k < n;k++)
                ret.m[i][j] += a.m[i][k] * b.m[k][j];
    return ret;
}

void QuickPower(int N,int n){
    // 求 n阶方阵 的 N次幂
    for (int i = 0; i < n;i++)
        for (int j = 0; j < n;j++)
            ans.m[i][j] = 0;
    while(N){
        if(N&1)
            ans = Mul(ans, res,n);
        N >>= 1;
        res = Mul(res, res,n);
    }

}
复制代码

 

posted @   失败者_ant  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示