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

第一行是一整数m,代表总共有m个cases。

Output

对于每个case,输出一行。格式见样例,冒号后有一个空格。

Sample Input

2 3 6

Sample Output

Case 1: 37 Case 2: 313

Source

FOJ月赛-2009年2月- Coral

 

 
题意不看,刚开始觉得好水。直接快速幂就可以做。
后来发现求和的,囧...
————————————————————————————
 
  1 /*
  2 矩阵构造:
  3 假设前N项和为S(n), 那么可以推出 S(n)=S(n-1)+f(n);
  4 得到一个矩阵:
  5 
  6 | 1 1 0 0 | | s(n-1) |   |  S(n)  |
  7 | 0 3 2 7 | |  f(n)  | = | f(n+1) |
  8 | 0 1 0 0 | | f(n-1) |   |  f(n)  |
  9 | 0 0 1 0 | | f(n-2) |   | f(n-1) |
 10 
 11 然后每一个N,一次快速幂,过了?额,下面就是这样的代码
 12 超时ing...
 13 
 14 那么就要优化了。优化:题目中矩阵是不变的,只是单纯的问
 15 n的值。保存2^i的结果。每一个数字都能由2^i组成。(二进制优化)
 16 
 17 这样就节省了很多的时间。
 18 484 ms
 19 
 20 特别注意:
 21 在最初的编写过程中,我只是用 (M_tom.mat[1][1]*4+M_tom.mat[1][2]*5)%mod;
 22 这样做的结果是答案偏小了。问题在于还要加上 (M_tom.mat[1][3]*3+M_tom.mat[1][4]*1);
 23 这就是数学的问题了.....囧
 24 动手试一试
 25 */
 26 
 27 /*
 28 #include<iostream>
 29 #include<cstdio>
 30 #include<cstring>
 31 #include<cstdlib>
 32 using namespace std;
 33 typedef __int64 LL;
 34 const __int64 mod=2009;
 35 
 36 struct Matrix
 37 {
 38     LL mat[6][6];
 39     void ini()
 40     {
 41         memset(mat,0,sizeof(mat));
 42     }
 43     void first_ini()
 44     {
 45         for(LL i=1;i<=4;i++)
 46         for(LL j=1;j<=4;j++)
 47         if(i==j) mat[i][j]=1;
 48         else mat[i][j]=0;
 49     }
 50 }M_hxl,M_tom;
 51 
 52 
 53 void make_first()
 54 {
 55     M_hxl.mat[1][1]=1;M_hxl.mat[1][2]=1;M_hxl.mat[1][3]=0;M_hxl.mat[1][4]=0;
 56     M_hxl.mat[2][1]=0;M_hxl.mat[2][2]=3;M_hxl.mat[2][3]=2;M_hxl.mat[2][4]=7;
 57     M_hxl.mat[3][1]=0;M_hxl.mat[3][2]=1;M_hxl.mat[3][3]=0;M_hxl.mat[3][4]=0;
 58     M_hxl.mat[4][1]=0;M_hxl.mat[4][2]=0;M_hxl.mat[4][3]=1;M_hxl.mat[4][4]=0;
 59 }
 60 
 61 Matrix Multiply(Matrix cur,Matrix now)
 62 {
 63     Matrix ww;
 64     ww.ini();
 65     for(LL i=1;i<=4;i++)
 66     for(LL k=1;k<=4;k++)
 67     if(cur.mat[i][k])
 68     {
 69         for(LL j=1;j<=4;j++)
 70         if(now.mat[k][j])
 71         {
 72             ww.mat[i][j]+=cur.mat[i][k]*now.mat[k][j];
 73             if(ww.mat[i][j]>=mod)
 74             ww.mat[i][j]%=mod;
 75         }
 76     }
 77     return ww;
 78 }
 79 
 80 void power_sum2(LL n)
 81 {
 82       M_tom.first_ini();
 83       while(n)
 84       {
 85           if(n&1)
 86           {
 87               M_tom=Multiply(M_hxl,M_tom);
 88           }
 89           n=n>>1;
 90           M_hxl=Multiply(M_hxl,M_hxl);
 91       }
 92       LL sum=0;
 93       sum=(sum+M_tom.mat[1][1]*4)%mod;
 94       sum=(sum+M_tom.mat[1][2]*5)%mod;
 95       sum=(sum+M_tom.mat[1][3]*3)%mod;//!!!开始时没有加
 96       sum=(sum+M_tom.mat[1][4]*1)%mod;//!!!开始时没有加
 97       printf("%I64d\n",sum);
 98 }
 99 
100 int main()
101 {
102     LL T,n,i;
103     while(scanf("%I64d",&T)>0)
104     {
105         for(i=1;i<=T;i++)
106         {
107             scanf("%I64d",&n);
108             printf("Case %I64d: ",i);
109             if(n==0)printf("1\n");
110             else if(n==1) printf("4\n");
111             else if(n==2) printf("9\n");
112             else
113             {
114                 make_first();
115                 power_sum2(n-1);
116             }
117         }
118     }
119     return 0;
120 }
121 
122 
123 */
124 
125 #include<iostream>
126 #include<cstdio>
127 #include<cstring>
128 #include<cstdlib>
129 using namespace std;
130 typedef __int64 LL;
131 const __int64 mod=2009;
132 
133 struct Matrix
134 {
135     LL mat[6][6];
136     void ini()
137     {
138         memset(mat,0,sizeof(mat));
139     }
140     void first_ini()
141     {
142         for(LL i=1;i<=4;i++)
143         for(LL j=1;j<=4;j++)
144         if(i==j) mat[i][j]=1;
145         else mat[i][j]=0;
146     }
147     void init()
148     {
149         mat[1][1]=1;mat[1][2]=1;mat[1][3]=0;mat[1][4]=0;
150         mat[2][1]=0;mat[2][2]=3;mat[2][3]=2;mat[2][4]=7;
151         mat[3][1]=0;mat[3][2]=1;mat[3][3]=0;mat[3][4]=0;
152         mat[4][1]=0;mat[4][2]=0;mat[4][3]=1;mat[4][4]=0;
153     }
154 }M_hxl[40],M_tom;
155 
156 Matrix Multiply(Matrix cur,Matrix now)
157 {
158     Matrix ww;
159     ww.ini();
160     for(LL i=1;i<=4;i++)
161     for(LL k=1;k<=4;k++)
162     if(cur.mat[i][k])
163     {
164         for(LL j=1;j<=4;j++)
165         if(now.mat[k][j])
166         {
167             ww.mat[i][j]+=cur.mat[i][k]*now.mat[k][j];
168             if(ww.mat[i][j]>=mod)
169             ww.mat[i][j]%=mod;
170         }
171     }
172     return ww;
173 }
174 
175 void power_sum2(LL n)
176 {
177       M_tom.first_ini();//!!
178       LL cnt=0;
179       while(n)
180       {
181           if(n&1)
182           {
183               M_tom=Multiply(M_hxl[cnt],M_tom);
184           }
185           n=n>>1;
186           cnt++;//模拟二进制.
187       }
188       LL sum=0;
189       sum=(sum+M_tom.mat[1][1]*4)%mod;
190       sum=(sum+M_tom.mat[1][2]*5)%mod;
191       sum=(sum+M_tom.mat[1][3]*3)%mod;//!!!开始时没有加
192       sum=(sum+M_tom.mat[1][4]*1)%mod;//!!!开始时没有加
193       printf("%I64d\n",sum);
194 }
195 
196 void pripare()
197 {
198     LL i;
199     M_hxl[0].init();
200     for(i=1;i<32;i++)
201     M_hxl[i]=Multiply(M_hxl[i-1],M_hxl[i-1]);
202 }
203 
204 int main()
205 {
206     LL T,n,i;
207     pripare();//打表。
208     while(scanf("%I64d",&T)>0)
209     {
210         for(i=1;i<=T;i++)
211         {
212             scanf("%I64d",&n);
213             printf("Case %I64d: ",i);
214             if(n==0)printf("1\n");
215             else if(n==1) printf("4\n");
216             else if(n==2) printf("9\n");
217             else
218             {
219                 power_sum2(n-1);
220             }
221         }
222     }
223     return 0;
224 }

 

转载于:https://www.cnblogs.com/tom987690183/p/3289399.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值