fuzhou 1683 纪念SlingShot ***
Problem 1683 纪念SlingShot
Accept: 361 Submit: 1287
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给定的每个n,输出F(0)+ F(1)+ …… + F(n) mod 2009。
Input
Output
Sample Input
Sample Output
Source
FOJ月赛-2009年2月- Coral
/*
矩阵构造:
假设前N项和为S(n), 那么可以推出 S(n)=S(n-1)+f(n);
得到一个矩阵: | 1 1 0 0 | | s(n-1) | | S(n) |
| 0 3 2 7 | | f(n) | = | f(n+1) |
| 0 1 0 0 | | f(n-1) | | f(n) |
| 0 0 1 0 | | f(n-2) | | f(n-1) | 然后每一个N,一次快速幂,过了?额,下面就是这样的代码
超时ing... 那么就要优化了。优化:题目中矩阵是不变的,只是单纯的问
n的值。保存2^i的结果。每一个数字都能由2^i组成。(二进制优化) 这样就节省了很多的时间。
484 ms 特别注意:
在最初的编写过程中,我只是用 (M_tom.mat[1][1]*4+M_tom.mat[1][2]*5)%mod;
这样做的结果是答案偏小了。问题在于还要加上 (M_tom.mat[1][3]*3+M_tom.mat[1][4]*1);
这就是数学的问题了.....囧
动手试一试
*/ /*
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef __int64 LL;
const __int64 mod=2009; struct Matrix
{
LL mat[6][6];
void ini()
{
memset(mat,0,sizeof(mat));
}
void first_ini()
{
for(LL i=1;i<=4;i++)
for(LL j=1;j<=4;j++)
if(i==j) mat[i][j]=1;
else mat[i][j]=0;
}
}M_hxl,M_tom; void make_first()
{
M_hxl.mat[1][1]=1;M_hxl.mat[1][2]=1;M_hxl.mat[1][3]=0;M_hxl.mat[1][4]=0;
M_hxl.mat[2][1]=0;M_hxl.mat[2][2]=3;M_hxl.mat[2][3]=2;M_hxl.mat[2][4]=7;
M_hxl.mat[3][1]=0;M_hxl.mat[3][2]=1;M_hxl.mat[3][3]=0;M_hxl.mat[3][4]=0;
M_hxl.mat[4][1]=0;M_hxl.mat[4][2]=0;M_hxl.mat[4][3]=1;M_hxl.mat[4][4]=0;
} Matrix Multiply(Matrix cur,Matrix now)
{
Matrix ww;
ww.ini();
for(LL i=1;i<=4;i++)
for(LL k=1;k<=4;k++)
if(cur.mat[i][k])
{
for(LL j=1;j<=4;j++)
if(now.mat[k][j])
{
ww.mat[i][j]+=cur.mat[i][k]*now.mat[k][j];
if(ww.mat[i][j]>=mod)
ww.mat[i][j]%=mod;
}
}
return ww;
} void power_sum2(LL n)
{
M_tom.first_ini();
while(n)
{
if(n&1)
{
M_tom=Multiply(M_hxl,M_tom);
}
n=n>>1;
M_hxl=Multiply(M_hxl,M_hxl);
}
LL sum=0;
sum=(sum+M_tom.mat[1][1]*4)%mod;
sum=(sum+M_tom.mat[1][2]*5)%mod;
sum=(sum+M_tom.mat[1][3]*3)%mod;//!!!开始时没有加
sum=(sum+M_tom.mat[1][4]*1)%mod;//!!!开始时没有加
printf("%I64d\n",sum);
} int main()
{
LL T,n,i;
while(scanf("%I64d",&T)>0)
{
for(i=1;i<=T;i++)
{
scanf("%I64d",&n);
printf("Case %I64d: ",i);
if(n==0)printf("1\n");
else if(n==1) printf("4\n");
else if(n==2) printf("9\n");
else
{
make_first();
power_sum2(n-1);
}
}
}
return 0;
} */ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef __int64 LL;
const __int64 mod=; struct Matrix
{
LL mat[][];
void ini()
{
memset(mat,,sizeof(mat));
}
void first_ini()
{
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
if(i==j) mat[i][j]=;
else mat[i][j]=;
}
void init()
{
mat[][]=;mat[][]=;mat[][]=;mat[][]=;
mat[][]=;mat[][]=;mat[][]=;mat[][]=;
mat[][]=;mat[][]=;mat[][]=;mat[][]=;
mat[][]=;mat[][]=;mat[][]=;mat[][]=;
}
}M_hxl[],M_tom; Matrix Multiply(Matrix cur,Matrix now)
{
Matrix ww;
ww.ini();
for(LL i=;i<=;i++)
for(LL k=;k<=;k++)
if(cur.mat[i][k])
{
for(LL j=;j<=;j++)
if(now.mat[k][j])
{
ww.mat[i][j]+=cur.mat[i][k]*now.mat[k][j];
if(ww.mat[i][j]>=mod)
ww.mat[i][j]%=mod;
}
}
return ww;
} void power_sum2(LL n)
{
M_tom.first_ini();//!!
LL cnt=;
while(n)
{
if(n&)
{
M_tom=Multiply(M_hxl[cnt],M_tom);
}
n=n>>;
cnt++;//模拟二进制.
}
LL sum=;
sum=(sum+M_tom.mat[][]*)%mod;
sum=(sum+M_tom.mat[][]*)%mod;
sum=(sum+M_tom.mat[][]*)%mod;//!!!开始时没有加
sum=(sum+M_tom.mat[][]*)%mod;//!!!开始时没有加
printf("%I64d\n",sum);
} void pripare()
{
LL i;
M_hxl[].init();
for(i=;i<;i++)
M_hxl[i]=Multiply(M_hxl[i-],M_hxl[i-]);
} int main()
{
LL T,n,i;
pripare();//打表。
while(scanf("%I64d",&T)>)
{
for(i=;i<=T;i++)
{
scanf("%I64d",&n);
printf("Case %I64d: ",i);
if(n==)printf("1\n");
else if(n==) printf("4\n");
else if(n==) printf("9\n");
else
{
power_sum2(n-);
}
}
}
return ;
}
fuzhou 1683 纪念SlingShot ***的更多相关文章
- FOJ 1683 纪念SlingShot(矩阵快速幂)
C - 纪念SlingShot Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5, ...
- FZU 1683 纪念SlingShot(矩阵水)
纪念SlingShot [题目链接]纪念SlingShot [题目类型]矩阵水 &题解: 这代码调了十多分钟,结果是Mul没返回值,好zz啊. 令sum(n)=sum(n-1)+f(n) 那么 ...
- 纪念SlingShot 矩阵
第一次独立做矩阵,只WA了一次,好高兴~~ 题意:已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给 ...
- Foj1683矩阵快速幂水题
Foj 1683 纪念SlingShot 题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683 题目:已知 F(n)=3 * F(n-1)+2 * F(n-2 ...
- 魅族M8时期写过几个app,纪念一下曾经的自己
找工作的过程中也看了不少资料和文章,也学着别人弄弄博客,但发现自己临时的行为有点那啥吧..曾经我也写过不少东西,有过自己的一个技术论坛,为当时的魅族M8手机写过一个系列的技术帖子,但因为论坛被我关了, ...
- 分享几个.NET WinForm开源组件,纪念逐渐远去的WinForm。。。
前面3个月的时间内,这些.NET开源项目你知道吗?系列文章已经发表了3篇,共计45个平时接触比较少,曾经默默无闻的.NET开源项目,展示给大家,当然不是每个人都能用得上,但也的确是有些人用了,反响还不 ...
- WP7 手机软件纪念 - 稍后读软件
在本月换机之际,决定写篇博客纪念一下我在 WP7 手机上开发的一个稍后读软件.这个工具开发完成后,两年间,我的 WP7 手机 80% 的用途,都发挥在了它身上. 这个软件其实是一个离线阅读工具,非常类 ...
- BZOJ AC800纪念
貌似没什么好纪念的...QAQQQ 好不容易水到了800还是记录一下好了....不过感觉水这么多题没有意义啊[思考熊] 然后就没有然后了恩 不过我到底是为什么才努力的呢...前途一阵迷茫,根本没有什么 ...
- 【特别推荐】10款唯美浪漫的婚礼 & 结婚纪念网站模板
互联网的重要性不言而喻,如今我们的生活已经完全离不开网络.这里给大家分享一组唯美浪漫的结婚邀请网站以及婚礼请柬网站模板,如果你也正想制作这样的网站,相信这些漂亮的网站模板能够带给你很大的帮助,让你快速 ...
随机推荐
- aspx代码审计-2
今天和大家分享一下aspx网站的代码审计,漏洞类型为:未授权访问和任意文件下载. 本文作者:i春秋签约作家——非主流 今天看的源码文件就不共享给大家了,本文只作学习只用. 还是先看我们的文件夹目录和d ...
- 【JVM】jvm启动参数
-server -Xmx2048m -Xms1500m -Xmn1024m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConc ...
- [实战] SSH 图形化转发
[实战] SSH 图形化转发 一.介绍 Unix Like操作系统不是只能进行服务器的架设而已,在美编.排版.制图.多媒体应用上也是有其需要的.这些需求都需要用到图形介面(Graphical User ...
- 浅谈HashMap原理,记录entrySet中的一些疑问
HashMap的底层的一些变量: transient Node<K,V>[] table; //存储数据的Node数组 transient Set<java.util.Map.Ent ...
- IOS----UIScrollerView的使用
刚刚遛狗回来,前段时间创建的这篇博客一直没有填充内容,今天把scrollerview正好整理一下. 1.scrollerview的主要作用:当界面显示不开要显示的内容,scrollerview提供了滑 ...
- 线索二叉树的理解和实现(Java)
线索二叉树的基本概念 我们按某种方式对二叉树进行遍历,将二叉树中所有节点排序为一个线性序列,在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结 ...
- 腾讯云服务器安装宝塔面板快速配置LNMP/LAMP网站系统
我们在选择购买腾讯云服务器之后,有部分用户肯定是用来建站用途的.毕竟云服务器的性能和功能比虚拟主机优秀很多.腾讯云服务器拥有香港.北京.广州.上海.美国等多个机房,可以安装Linux和Windows系 ...
- win10 下springcloud打包docker镜像部署。
1:建一个最简单的springcloud应用. 2:在根目录下新建dockerfile,文件如下: FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE ...
- mysql数据库基本知识
一.库操作 创建数据库:creat database 'mydababase1';creat database if not exists 'mydababase1' //只有两个选项 查询数据库: ...
- IT人生的价值和意义 感觉真的有了
为了做新闻APP,我居然短短一个月利用业余时间做了: 一个通用新闻采集器. 一个新闻后台审核网站. 一个通用采集器下载网站. 一个新闻微网站. 一个新闻APP, 而且还给新闻微网站和新闻 APP练就 ...