首页 > 其他分享 >Magic Gems 矩阵乘法

Magic Gems 矩阵乘法

时间:2024-09-02 16:38:34浏览次数:11  
标签:Gems Magic 宝石 int 魔法 long 乘法

// Magic Gems.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/22/problem/1046

题目描述
Reziba 拥有无限多个魔法宝石,每个魔法宝石的大小为 1
 单元。每个魔法宝石可以被分解为 m
 个普通宝石,每个普通宝石的大小也是 1
 单元。

现在 Reziba 需要选出一部分魔法宝石,并且选择其中一些进行分解,使得最后的宝石能够占满 n
 单元大小的空间。请问有多少种不同的选择与分解方案,请输出答案模 109+7
 。(如果两种方案选择的魔法宝石的数量不同,或者分解的魔法宝石在序列中的位置不同就认为是不同的方案)。

输入格式
第一行两个整数 n,m
。

输出格式
一行一个数表示答案模 109+7
 的结果。

样例输入
4 2
样例输出
5
数据范围
对于 100%
 的数据,保证 1≤n≤10^18,2≤m≤100
。
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>


using namespace std;

const int N = 100;
const int P = 1000000007;;

int n;
long long k;
long long f[N + 1], a[N + 1][N + 1];

inline void aa() {
    long long  w[N + 1][N + 1];
    memset(w, 0, sizeof w);
    for (int i = 1; i <= n; i++) {
        for (int k = 1; k <= n; k++) {
            if(a[i][k])
                for (int j = 1; j <= n; j++) {
                    if (a[k][j])
                        w[i][j] += a[i][k] * a[k][j], w[i][j] %= P;
                }
        }
    }

    memcpy(a, w, sizeof a);
}


inline void fa() {
    long long w[N + 1];
    memset(w, 0, sizeof w);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            w[i] += f[j] * a[j][i], w[i] %= P;
    memcpy(f, w, sizeof f);
}

inline void matrixpow(long long k) {
    for (; k; k >>= 1) {
        if (k & 1) {
            fa();
        }
        aa();
    }
}

int main()
{
    scanf("%lld%d",&k,&n);
    for (int i = 2; i <= n; i++)
        a[i][i - 1] = 1;
    a[1][n] = 1;
    a[n][n] = 1;
    f[n] = 1;
    matrixpow(k);
    printf("%lld\n",f[n]);
}

标签:Gems,Magic,宝石,int,魔法,long,乘法
From: https://www.cnblogs.com/itdef/p/18392938

相关文章

  • CUDA教程之 10 掌握 CUDA 矩阵乘法:共享内存、Tile 内存合并和 Bank 冲突简介(教程含源
    介绍在使用CUDA进行GPU编程的世界中,优化性能是关键。实现此目标的最强大技术之一是使用共享内存。本博客将引导您完成使用共享内存执行矩阵乘法的CUDA程序,特别关注理解分块内存合并和存储体冲突。在本文结束时,您将牢固掌握共享内存如何显著加快您的计算速度以及如何......
  • Linux Debian12使用flameshot或gnome-screenshot和ImageMagick垂直合并多张图片后组成
    在发布博客,有时需要滚动截长图,虽然在windows系统有滚动截长图的工具,例如:FastStoneCapture等,但是LinuxDebian系统,这种滚动截长图的工具没有找到合适的。经过自己筛选验证,发现LinuxDebian12使用flameshot或gnome-screenshot截取多张图片,再使用和ImageMagick图像处理工具进行垂直合......
  • 乘法|python矩阵基本运算(学习笔记二)
    在前述文章中,我们已经知道,python通过使用numpy模块,创建矩阵形数组至少可以采用两种方法。也即,通过array和matrix子模块分别创建,详情请参考以下链接。https://blog.csdn.net/weixin_44855046/article/details/141564179?spm=1001.2014.3001.5502进一步,上述链接指向文章也通过测......
  • 乘法逆元 + 扩展欧几里得定理/算法
    数学之乘法逆元Part1:逆元是什么一个东西的逆元,就是指在一种运算/操作下能够抵消这个东西所带来影响的东东举个例子4的加法逆元就是-4​ 2在普通乘法中的逆元就是\(2^{-1}\)而乘法逆元指的是在模意义下的乘法逆元设原式为​\(1*a\equiva\modp\)那么......
  • 题解:UVA11996 Jewel Magic
    题意给你一个01串,要求完成以下操作:单点插入。单点删除。区间翻转。查询两点开始的LCP。分析先看查询操作,如何得到LCP的长度?我们可以考虑二分长度\(l\),然后用哈希检验区间\([p1,p1+l-1]\)是否等于区间\([p2,p2+l-1]\)。平衡树维护哈希即可。发现......
  • P2730 [USACO3.2] 魔板 Magic Squares
    [USACO3.2]魔板MagicSquares题目背景在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有888个大小相同的格子的魔板:......
  • 打印99乘法表
    我们的核心思想是以小化大1.先写出1的所有乘法2.设置一个变量,使得不止有1乘n3.将1的乘法放入变量中,使得1再次被循环包起来4.解决重复乘法图片中出现了两次1*4,说明刚才的表达式会有重复相乘出现重复的原因:a有1~9的数字而i也会有1~9,a*i就必然会有重复,我们需要让一个......
  • 【Python系列】 Python打印99乘法表
    ......
  • 九九乘法表
    先定义一个变量intn=0;遍历九次,当开始进入for循环的时候先递增,因为n++,i++,所以i=n,得到第一行:1x1,2x2~~~9x9接着再进入第二个for循环嵌套for循环的原理是:外层循环一次,内层全部循环publicstaticvoidEx18(){intn=0;//遍历9......
  • 高精度运算——大数加法与乘法
    要点:加法直接传递进位,乘法先保留进位,后统一处理使用int数组存储,空间浪费,处理方便建立bigNum结构(或类),处理清晰方便代码:基础定义#include<bits/stdc++.h>usingnamespacestd;charnum1[10000];charnum2[10000];structbigNum{ intnum[1000]={}; intlen;};vo......