FZU_1683 矩阵快速幂 求和
2024-09-07 05:38:15
这个题目确实是很简单的一个矩阵快速幂,但是我在求和的时候,用的是标准的求和,即,一共计算logN次Ak,但是这样会超时。
后来就发现原来本身和Sn=Sn-1+Fn;即Sn本身可以写在矩阵当中,所以直接求一次 Ak就能得出结果。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
struct Mat{
int mat[][];
};
Mat it,E,E0;
void init()
{
memset(it.mat,,sizeof (Mat));
memset(E.mat,,sizeof (Mat));
memset(E0.mat,,sizeof (Mat));
for (int i=;i<;i++)
E.mat[i][i]=;
it.mat[][]=;
it.mat[][]=;
it.mat[][]=;
it.mat[][]=; it.mat[][]=;
it.mat[][]=;
it.mat[][]=; it.mat[][]=;
it.mat[][]=;
}
Mat operator*(Mat a,Mat b)
{
Mat c;
c=E0;
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
{
if (a.mat[i][k] && b.mat[k][j])
{
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
c.mat[i][j]%=;
}
}
return c;
}
Mat operator^(Mat a,int x)
{
Mat c=E;
for (;x;x>>=)
{
if (x&)
c=c*a;
a=a*a;
}
return c;
} int main()
{
init();
int t;
scanf("%d",&t);
int counts=;
while (t--)
{
int n;
scanf("%d",&n);
int ans=;
printf("Case %d: ",++counts);
if (n>=){
Mat s=it^(n-);
ans=s.mat[][]*+s.mat[][]*+s.mat[][]*+s.mat[][];
ans%=;
}
if (n==) ans=;
if (n==) ans=;
if (n==) ans=;
printf("%d\n",ans);
}
return ;
}
最新文章
- Winform窗体最大化的时候,如何指定窗体的位置、大小
- [DOM Event Learning] Section 1 DOM Event 处理器绑定的几种方法
- 团队博客作业- Week3
- 南非的5DT数据手套使用说明
- Bar菜单
- 简单的VC++ ADO帮助类
- Http规范
- Learn ZYNQ Programming(1)
- 【Linux】浅谈段页式内存管理
- 转--Android按钮单击事件的四种常用写法总结
- Java数据库编程(JDBC)
- 关于idea激活
- slf4j 之logback日志之环境安装【一】
- --@angularJS--ng-show应用
- [uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)
- Android笔记: 实现手机震动效果
- 【慕课网实战】九、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
- caffe实际运行中遇到的问题
- RPMB分区介绍【转】
- KVM总结-KVM性能优化之内存优化
热门文章
- 99乘法表(for循环嵌套)
- 009、Java中超过了int的最大值或最小值的结果
- UVA - 548 Tree(二叉树的递归遍历)
- Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等
- Python 中 对logging 模块进行封装,记录bug日志、日志等级
- 八十二、SAP中的ALV创建之一,新建一个程序
- MySQL5.7忘记密码解决方案
- XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)
- SpringBoot+SpringSecurity之多模块用户认证授权同步
- POJ 2346:Lucky tickets