首页 > 其他分享 >HDU4382(特殊的矩阵连乘)

HDU4382(特殊的矩阵连乘)

时间:2023-05-31 23:34:14浏览次数:55  
标签:连乘 str3 str2 矩阵 C2 C1 HDU4382 tmp1 strcmp


题目:Harry Potter and Cyber Sequence Generator


题意,有两个容器C1,C2,初始的时候C1中有一个数的值为V,给你K个操作,每次都重复这K个操作N遍,最后问你C2中的数是

     多少。N<=10^100。

1:循环操作的次数巨大,敏感的想到这是矩阵连乘的题目。

2:K个操作可以得出一个矩阵,N个K操作就是这个矩阵的N次方

3:最后再乘以初始矩阵即可


#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
typedef long long LL;

const LL MOD=1000000007;
const int N=3;

struct Matrix
{
    LL m[N][N];
};

Matrix per={1,0,0,0,1,0,0,0,1};

Matrix multi(Matrix a,Matrix b)
{
    Matrix c;
    int i,j,k;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            c.m[i][j]=0;
            for(k=0;k<N;k++)
            {
                c.m[i][j]+=(a.m[i][k]%MOD*(b.m[k][j]%MOD))%MOD;
                c.m[i][j]%=MOD;
            }
        }
    }
    return c;
}

Matrix matrix_mod(Matrix a,LL k)
{
    Matrix ans=per,p=a;
    while(k)
    {
        if(k&1)
        {
            ans=multi(ans,p);
            k--;
        }
        k>>=1;
        p=multi(p,p);
    }
    return ans;
}

LL getNum(char *str)
{
    LL ans=0;
    int len=strlen(str);
    for(int i=0;i<len;i++)
        ans=ans*10+str[i]-'0';
    return ans;
}

int main()
{
    Matrix ans,tmp1;
    LL T,V,Q,cas=1;
    char str[105];
    char str1[105];
    char str2[105];
    char str3[105];
    cin>>T;
    while(T--)
    {
        cin>>V;
        ans=per;
        while(cin>>str1)
        {
            if(str1[0]=='E') break;
            cin>>str2>>str3;
            tmp1=per;
            if(str1[0]=='S')
            {
                if(strcmp(str2,"C1,")==0&&strcmp(str3,"C2")==0)
                {
                    tmp1.m[0][0]=0;
                    tmp1.m[1][0]=1;
                }
                else if(strcmp(str2,"C2,")==0&&strcmp(str3,"C1")==0)
                {
                    tmp1.m[0][1]=1;
                    tmp1.m[1][1]=0;
                }
                else if(strcmp(str2,"C1,")==0&&strcmp(str3,"C1")!=0)
                {
                    tmp1.m[0][0]=0;
                    tmp1.m[2][0]=getNum(str3);
                }
                else if(strcmp(str2,"C2,")==0&&strcmp(str3,"C2")!=0)
                {
                    tmp1.m[1][1]=0;
                    tmp1.m[2][1]=getNum(str3);
                }
            }
            if(str1[0]=='A')
            {
                if(strcmp(str2,"C1,")==0&&strcmp(str3,"C1")==0)
                    tmp1.m[0][0]=2;
                else if(strcmp(str2,"C2,")==0&&strcmp(str3,"C2")==0)
                    tmp1.m[1][1]=2;
                else if(strcmp(str2,"C1,")==0&&strcmp(str3,"C2")==0)
                    tmp1.m[1][0]=1;
                else if(strcmp(str2,"C2,")==0&&strcmp(str3,"C1")==0)
                    tmp1.m[0][1]=1;
                else if(strcmp(str2,"C1,")==0)
                    tmp1.m[2][0]=getNum(str3);
                else
                    tmp1.m[2][1]=getNum(str3);
            }
            if(str1[0]=='M')
            {
                if(strcmp(str2,"C1,")==0)
                    tmp1.m[0][0]=getNum(str3);
                else
                    tmp1.m[1][1]=getNum(str3);
            }
            ans=multi(ans,tmp1);
        }
        cin>>Q;
        cout<<"Case "<<cas++<<":"<<endl;
        while(Q--)
        {
            cin>>str;
            LL ret=0;
            int len=strlen(str);
            for(int i=0;i<len;i++)
            {
                ret=ret*10+str[i]-'0';
                ret%=(MOD-1);
            }
            Matrix final=matrix_mod(ans,ret);
            LL sum=(final.m[0][1]%MOD*(V%MOD)%MOD+final.m[2][1]%MOD)%MOD;
            cout<<sum<<endl;
        }
    }
    return 0;
}




标签:连乘,str3,str2,矩阵,C2,C1,HDU4382,tmp1,strcmp
From: https://blog.51cto.com/u_16146153/6391069

相关文章

  • 系数矩阵为Hessian矩阵时的使用Pearlmutter trick的共轭梯度解法
    共轭梯度法已经在前文中给出介绍:python版本的“共轭梯度法”算法代码  =======================================  使用共轭梯度法时,如果系数矩阵为Hessian矩阵,那么我们可以使用Pearlmuttertrick技术来减少计算过程中的内存消耗,加速计算。 使用Pearlmuttertrick的......
  • 协方差与协方差矩阵
    本文讲的主要内容是协方差以及协方差矩阵。在统计学中,我们见过的最基本的三个概念是均值,方差,标准差。假定给定了n个样本的集合,那么公式如下     均值是描述样本的平均值,标准差描述的是样本集合的各个点到均值距离的平均,体现了样本的散步程度。而方差仅仅是标准差的平方。实际......
  • 1439. 有序矩阵中的第 k 个最小数组和
    给你一个m *n的矩阵mat,以及一个整数k,矩阵中的每一行都以非递减的顺序排列。你可以从每一行中选出1个元素形成一个数组。返回所有可能数组中的第k个最小数组和。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/find-the-kth-smallest-sum-of-a-matrix-with-so......
  • 矩阵
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inti,j,p; floatarr1[3][3],arr2[3][3],arr[3][3],arr0[3][3]={0}; printf("请输入两个三行三列的矩阵:\n"); for(i=0;i<3;i++) {  for(j=0;j<3;j++)  scanf......
  • python推荐系统实现(矩阵分解来协同过滤)|附代码数据
    原文链接:http://tecdat.cn/?p=10911最近我们被客户要求撰写关于推荐系统的研究报告,包括一些图形和统计输出。用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品 1.用户和产品的潜在特征我们可以通过为每个用户和每部电影分配属性,然后将它们相......
  • hdu 5171(矩阵快速幂)
    GTY'sbirthdaygiftTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/65536K(Java/Others)ProblemDescriptiona,b∈S),andadda+b Input2≤n≤100000,1≤k≤1000000000).Thesecondlinecontainsnelementsai......
  • 前缀和 (Acwing_796 子矩阵的和)
    题目1.S[i,j]即为图1红框中所有数的的和为:S[i,j]=S[i,j−1]+S[i−1,j]−S[i−1,j−1]+a[i,j]2.(x1,y1),(x2,y2)这一子矩阵中的所有数之和为:S[x2,y2]−S[x1−1,y2]−S[x2,y1−1]+S[x1−1,y1−1]#include<iostream>usingnamespacestd;constintN=1e3+10;int......
  • 什么是数据结构中的特殊矩阵和稀疏矩阵
    在数据结构中,特殊矩阵和稀疏矩阵是描述矩阵中元素分布特点的两个概念。特殊矩阵(SpecialMatrix)是指具有一定规律和特殊性质的矩阵,其中大部分元素具有相同的值或者具有特定的规律。特殊矩阵的特点在于其元素之间存在一种明显的关联关系,可以利用这种关系来进行高效的存储和操作。......
  • 描述图的两种数据结构 - 邻接表和邻接矩阵
    图的邻接表和邻接矩阵是两种常用的表示图的数据结构,用于描述图中各个顶点之间的连接关系。图是由一组顶点和一组边组成的数据结构,顶点表示图中的对象,边表示对象之间的关系。邻接表和邻接矩阵都可以有效地表示图的结构,并提供了不同的优势和适用场景。邻接表:邻接表是一种链表的......
  • 有序矩阵中的第 k 个最小数组和-小顶堆法
    有序矩阵中的第k个最小数组和题目描述方法一从上到下遍历矩阵的所有行,假设计算出了前\(i−1\)行形成的前\(k\)个最小数组和(记作\(sum\)),遍历到第\(i\)行时,把\(sum\)与第\(i\)行的数两两相加,然后只保留其中最小的\(k\)个数,作为新的\(sum\),然后继续遍历矩阵的下......