这个题目确实是很简单的一个矩阵快速幂,但是我在求和的时候,用的是标准的求和,即,一共计算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 ;
}

最新文章

  1. Winform窗体最大化的时候,如何指定窗体的位置、大小
  2. [DOM Event Learning] Section 1 DOM Event 处理器绑定的几种方法
  3. 团队博客作业- Week3
  4. 南非的5DT数据手套使用说明
  5. Bar菜单
  6. 简单的VC++ ADO帮助类
  7. Http规范
  8. Learn ZYNQ Programming(1)
  9. 【Linux】浅谈段页式内存管理
  10. 转--Android按钮单击事件的四种常用写法总结
  11. Java数据库编程(JDBC)
  12. 关于idea激活
  13. slf4j 之logback日志之环境安装【一】
  14. --@angularJS--ng-show应用
  15. [uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)
  16. Android笔记: 实现手机震动效果
  17. 【慕课网实战】九、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
  18. caffe实际运行中遇到的问题
  19. RPMB分区介绍【转】
  20. KVM总结-KVM性能优化之内存优化

热门文章

  1. 99乘法表(for循环嵌套)
  2. 009、Java中超过了int的最大值或最小值的结果
  3. UVA - 548 Tree(二叉树的递归遍历)
  4. Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等
  5. Python 中 对logging 模块进行封装,记录bug日志、日志等级
  6. 八十二、SAP中的ALV创建之一,新建一个程序
  7. MySQL5.7忘记密码解决方案
  8. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)
  9. SpringBoot+SpringSecurity之多模块用户认证授权同步
  10. POJ 2346:Lucky tickets