【洛谷P3216】【BZOJ2326】数学作业【矩阵乘法】

2024-01-30 10:18

本文主要是介绍【洛谷P3216】【BZOJ2326】数学作业【矩阵乘法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

题目链接:
洛谷:https://www.luogu.org/problemnew/show/P3216
Bzoj:https://www.lydsy.com/JudgeOnline/problem.php?id=2326
123... n ‾ % m \overline{123...n}\ \%\ m 123...n % m


思路:

这种矩阵乘法的题目一看 n ≤ 1 0 18 n\leq 10^{18} n1018的数据范围就明显地提示了算法。。。
思路还是很简单的。对于任意的 f [ i ] f[i] f[i]表示 123... i ‾ % m \overline{123...i}\ \%\ m 123...i % m f [ i + 1 ] f[i+1] f[i+1]显然等于
( f [ i ] × c n t + i + 1 ) % m (f[i]\times cnt+i+1)\ \%\ m (f[i]×cnt+i+1) % m
其中 c n t cnt cnt表示 i + 1 i+1 i+1的位数。
显然,对于任意不同位数的 i i i,需要分开来矩乘。
在这里插入图片描述

注意 l o n g l o n g × l o n g l o n g long\ long\times long\ long long long×long long可能会爆炸。
时间复杂度 O ( l o g n ) O(log\ n) O(log n)


代码:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;ll n,k,MOD,f[4],a[4][4];void mul(ll f[4],ll a[4][4])
{ll c[4]={0,0,0,0};for (int i=1;i<=3;i++)for (int j=1;j<=3;j++)c[i]=(c[i]+f[j]*a[i][j])%MOD;memcpy(f,c,sizeof(c)); 
}void mulself(ll a[4][4])
{ll c[4][4];memset(c,0,sizeof(c));for (int i=1;i<=3;i++)for (int j=1;j<=3;j++)for (int k=1;k<=3;k++)c[i][j]=(c[i][j]+a[i][k]*a[k][j])%MOD;memcpy(a,c,sizeof(c)); 
}int  main()
{scanf("%lld%lld",&n,&MOD);f[1]=0,f[2]=0,f[3]=1;for (ll m=1;m<=n;m*=10){if (m>n/10) k=n-m+1;  //这个位数要矩乘的次数else k=m*9;a[1][1]=1; a[1][2]=0; a[1][3]=1;a[2][1]=1; a[2][2]=m*10%MOD; a[2][3]=1;a[3][1]=0; a[3][2]=0; a[3][3]=1;  //重置a数组while (k){if (k&1) mul(f,a);mulself(a);k>>=1;}	}printf("%lld",f[2]);return 0;
}

这篇关于【洛谷P3216】【BZOJ2326】数学作业【矩阵乘法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659924

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18