hdu 1588
2015-08-15 15:11
197 查看
Gauss Fibonacci
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2848 Accepted Submission(s): 1178
[align=left]Problem Description[/align]
Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. "
How good an opportunity that Gardon can not give up! The "Problem GF" told by Angel is actually "Gauss Fibonacci".
As we know ,Gauss is the famous mathematician who worked out the sum from 1 to 100 very quickly, and Fibonacci is the crazy man who invented some numbers.
Arithmetic progression:
g(i)=k*i+b;
We assume k and b are both non-nagetive integers.
Fibonacci Numbers:
f(0)=0
f(1)=1
f(n)=f(n-1)+f(n-2) (n>=2)
The Gauss Fibonacci problem is described as follows:
Given k,b,n ,calculate the sum of every f(g(i)) for 0<=i<n
The answer may be very large, so you should divide this answer by M and just output the remainder instead.
[align=left]Input[/align]
The input contains serveral lines. For each line there are four non-nagetive integers: k,b,n,M
Each of them will not exceed 1,000,000,000.
[align=left]Output[/align]
For each line input, out the value described above.
[align=left]Sample Input[/align]
2 1 4 100 2 0 4 100
[align=left]Sample Output[/align]
21 12
[align=left]Author[/align]
DYGG
[align=left]Source[/align]
HDU “Valentines Day” Open Programming Contest 2007-02-14
[align=left]Recommend[/align]
linle | We have carefully selected several similar problems for you: 1757 1575 2604 2294 2276
矩阵构造求和,然后在求模,矩阵的快速幂。
#include <iostream> using namespace std; const int MAX=4; const int maxl=2; int Mod; typedef struct { long long m[MAX][MAX]; }Matrix; typedef struct { long long m[maxl][maxl]; }Matrix2; Matrix P={0,0,1,0, 0,0,0,1, 0,0,1,0, 0,0,0,1}; Matrix I={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; Matrix2 P1={0,1, 1,1}; Matrix2 I1={1,0, 0,1}; Matrix matrixmul(Matrix a,Matrix b) { Matrix c; for(int i=0;i<MAX;i++) for(int j=0;j<MAX;j++) { c.m[i][j]=0; for(int k=0;k<MAX;k++) { c.m[i][j]+=(a.m[i][k]*b.m[k][j])%Mod; } c.m[i][j]=c.m[i][j]%Mod; } return c; } Matrix quickpow(long long n) { Matrix m=P,b=I; while(n>=1) { if(n&1) b=matrixmul(b,m); n=n>>1; m=matrixmul(m,m); } return b; } Matrix2 matrixmull(Matrix2 a,Matrix2 b) { Matrix2 c; for(int i=0;i<maxl;i++) for(int j=0;j<maxl;j++) { c.m[i][j]=0; for(int k=0;k<maxl;k++) { c.m[i][j]+=(a.m[i][k]*b.m[k][j])%Mod; } c.m[i][j]=c.m[i][j]%Mod; } return c; } Matrix2 quickpowl(long long n) { Matrix2 m=P1,b=I1; while(n>=1) { if(n&1) b=matrixmull(b,m); n=n>>1; m=matrixmull(m,m); } return b; } int main() { Matrix2 tp1,tp2; Matrix tp; long long k,b,n,m,sum; while(cin>>k>>b>>n>>Mod) { tp1=quickpowl(k); tp2=quickpowl(b); P.m[0][0]=tp1.m[0][0]; P.m[0][1]=tp1.m[0][1]; P.m[1][0]=tp1.m[1][0]; P.m[1][1]=tp1.m[1][1]; tp=quickpow(n); sum=((tp2.m[0][0]%Mod*tp.m[0][3]%Mod)+(tp2.m[0][1]%Mod*tp.m[1][3]%Mod))%Mod; cout<<sum<<endl; } return 0; }
相关文章推荐
- oracle创建user具体指示
- 一套完整系统对人生的意义
- 黑马程序员----包(package)
- spring常用的一些注解以及注解注入总结
- codeforces 569 E. New Language (2-sat)
- VMware Workstation11.0安装Mac OS X 10.10最完整指南(包含所需所有资源下载)
- 常用变量类型
- 裁减图片
- 苹果开发 笔记(61)recursiveDescription 方法
- Android透明状态栏(沉浸式状态栏)
- NGUI文本之中穿插图片
- ! [remote rejected] HEAD -> refs/for/ToonV3.0 (missing Change-Id in commit message footer)
- DSP数据运算基础
- 锁与分区
- find 命令结合 正则表达式
- poj 3522 Slim Span(最小生成树)kruskal算法
- SAP实施的难点在哪里?
- APP启动
- elasticSearch 新增数据
- android进程通信之Messenger