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款唯美浪漫的婚礼 & 结婚纪念网站模板
互联网的重要性不言而喻,如今我们的生活已经完全离不开网络.这里给大家分享一组唯美浪漫的结婚邀请网站以及婚礼请柬网站模板,如果你也正想制作这样的网站,相信这些漂亮的网站模板能够带给你很大的帮助,让你快速 ...
随机推荐
- ElasticSearch.net NEST批量创建修改删除索引完整示例
本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...
- multiprocessor(中)
一.进程同步(锁) 通过之前的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制.尽管并发编程让我们能更加充分的利用IO资源,但 ...
- github常用项目汇总
1.smartTable(智能表格) android自动生成表格框架 使用方法:在github中搜索smartTable 进入项目后,查看开源项目的介绍和使用方法即可.
- 【算法笔记】A1039 Course List for Student
https://pintia.cn/problem-sets/994805342720868352/problems/994805447855292416 题意: 有N个学生,K节课.给出选择每门课的 ...
- 不支持这个操作系统WNT_6.3I_64
安装winserver2012驱动时,经常会因为版本的关系,出现向后兼容问题: 编辑驱动安装配置ini, 添加向后兼容的标识即可:WNT_6.3I_64= Win81_64 删除system下的程序( ...
- C#控制台画图形
static void Main(string[] args) { //九九乘法 Console.WriteLine("九九乘法口诀"); ; i <= ; i++) { ; ...
- CentOS 7下安装RabbitMQ
下载erlang:http://www.erlang.org/downloads ,otp_src_20.3.tar.gz 下载RabbitMQ: http://www.rabbitmq.com ,r ...
- dubbo SPI设计
SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时, ...
- mono for android 百度map binding项目(转)
好丫小子之前发布过百度地图android SDK的mono for android绑定dll,许多朋友看过之后说想理解是怎么绑定的,现我把绑定的代码发出来. 针对2.1.2版本百度地图android ...
- (转)错误"因为数据库正在使用,所以无法获得对数据库的独占访问权"的解决方案
引发原因:是因为我在还原数据库的时候,还有其他的用户正在使用数据库,所以就会出现以上提示. 解决方法:1,设置数据库在单用户模式下工作.设置方法:在需要还原的数据库上右击,在右键菜单命令上选择&quo ...