HDU 1757 A Simple Math Problem(矩阵快速幂)
2024-10-18 22:33:40
题意 :给你m和k, 让你求f(k)%m。如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… + a9 * f(k-10);
思路 :先具体介绍一下矩阵快速幂吧,刚好刚刚整理了网上的资料。可以先了解一下这个是干嘛的,怎么用。
这个怎么弄出来的我就不说了,直接看链接吧,这实在不是我强项,点这儿,这儿也行
//HDU 1757
#include <iostream>
#include <stdio.h> using namespace std; struct matrix
{
int m[][] ;
} b,tp,res,init ; int n,m ; matrix Mul(matrix a,matrix b)
{
matrix c ;
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
c.m[i][j] = ;
for(int k = ; k < ; k++)
{
c.m[i][j] += (a.m[i][k] * b.m[k][j]) % m ;
c.m[i][j] %= m ;
}
}
}
return c ;
} matrix matrix_mi(matrix p,int k)
{
matrix t = res;
for(int i = ; i <= ; i++) t.m[i][i] = ;
while(k)
{
if(k & )
t = Mul(t,p) ;
k >>= ;
p = Mul(p,p) ;
}
return t ;
} void Init()
{
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(i- == j)
init.m[i][j]=;
else
init.m[i][j]=;
}
int main()
{
Init() ;
while(~scanf("%d %d",&n,&m))
{
b = init ;
for(int i = ; i < ; i++)
scanf("%d",&b.m[][i]) ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
if(i==j)
res.m[i][j] = ;
else
res.m[i][j] = ;
if(n >= )
{
int sum = ;
tp = matrix_mi(b,n-) ;
for(int i = ; i < ; i++)
sum += (tp.m[][i] * (-i))%m ;
printf("%d\n",sum%m) ;
}
else printf("%d\n",n%m) ;
}
return ;
}
最新文章
- 对于一个div下两个横内元素对其或者居中的方法
- 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)
- 【iOS 单例设计模式】底层解析与运用
- [Template]高精度模板
- 队列-java代码
- Working With Taxonomy Field in CSOM
- linux 查看cpu 内存 硬盘 文件夹大小
- C++语法报错收集
- winform —— 连接数据库SQL Server 2008
- ECSHOP 模版文件里的编辑区域
- \classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)
- LCT学习笔记
- 关于dom4j解析xml
- spring Boot+spring Cloud实现微服务详细教程第二篇
- pycharm 中 django 导入静态文件不提示补全
- CF 552(div 3) E Two Teams 线段树,模拟链表
- python mysql安装&;&;简单基础sql
- 7.6 GRASP原则六: 多态 Polymorphism
- 纯css实现不同方向的三角形
- k8s集群之上游dns--dnsmasq,统一管理kubernetes的dns解析