HITOJ 2060 類似斐波那契數列(一段和取模)
http://acm.hit.edu.cn/hoj/problem/view?id=2060
As we know , the Fibonacci numbers are defined as follows:
""""
Given two numbers a and b , calculate . """"
Input
The input contains several test cases. Each test case consists of two non-negative integer numbers a and b (0 ≤ a ≤ b ≤1,000,000,000). Input is terminated by a = b = 0.
Output
For each test case, output S mod 1,000,000,000, since S may be quite large.
Sample Input
1 1 3 5 10 1000 0 0Sample Output
1 16 496035733題目大意:給一個類似於Fibonacci的數列,求第a項到第b項的和取模。
解題思路:構造一個3*3的矩陣,利用矩陣連乘的思想求解
/*This Code is Submitted by life4711 for Problem 2060 at 2014-07-25 14:52:17*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
typedef long long LL;
const int N=3;
const LL MOD=1000000000;
struct Matrix
{
LL m[N][N];
};
Matrix I=
{
1,0,0,
0,1,0,
0,0,1
};
Matrix multi(Matrix a,Matrix b)
{
Matrix c;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
c.m[i][j]=0;
for(int k=0; k<N; 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 quick_mod(Matrix a,LL k)
{
Matrix ans=I;
while(k!=0)
{
if(k&1)
{
ans=multi(ans,a);
}
k>>=1;
a=multi(a,a);
}
return ans;
}
int main()
{
LL n,m;
while(~scanf("%lld%lld",&n,&m))
{
if(n==0&&m==0)
break;
Matrix A={1,1,1,
0,1,1,
0,1,0};
if(n==0)
{
Matrix x1=quick_mod(A,m-1);
LL s=(x1.m[0][0]*2%MOD+x1.m[0][1]+x1.m[0][2])%MOD;
if(s<0)
s+=MOD;
printf("%lld\n",s);
}
else if(n==1)
{
Matrix x1=quick_mod(A,m-1);
LL s=(x1.m[0][0]*2%MOD+x1.m[0][1]+x1.m[0][2])%MOD;
s=(s-1)%MOD;
if(s<0)
s+=MOD;
printf("%lld\n",s);
}
else
{
Matrix x1=quick_mod(A,m-1);
LL s1=(x1.m[0][0]*2%MOD+x1.m[0][1]+x1.m[0][2])%MOD;
x1=quick_mod(A,n-2);
LL s2=(x1.m[0][0]*2%MOD+x1.m[0][1]+x1.m[0][2])%MOD;
s1=(s1%MOD-s2%MOD)%MOD;
if(s1<0)
s1+=MOD;
printf("%lld\n",s1);
}
}
return 0;
}
相關文章
- 斐波那契數列
- 斐波那契數列(Java)Java
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 斐波那契數列詳解
- 斐波那契數
- js實現斐波那契數列JS
- 斐波那契數列js 實現JS
- 斐波那契數列演算法演算法
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- 【刷演算法】我知道的所有類似斐波那契數列的問題演算法
- 演算法(1)斐波那契數列演算法
- 面試題9-斐波那契數列面試題
- [C103] 斐波那契數列
- 使用Python實現斐波那契數列Python
- JavaScript 實現:輸出斐波那契數列JavaScript
- js迭代器實現斐波那契數列JS
- 演算法一:斐波那契阿數列演算法
- 斐波那契數列的分治法計算
- 斐波那契數列的python實現Python
- 大數斐波那契數列的演算法演算法
- Leedcode-斐波那契數
- 斐波那契數列三種實現函式函式
- 計算斐波那契數列的演算法演算法
- 劍指offer-9-斐波那契數列-javaJava
- 斐波那契數列演算法 JS 實現演算法JS
- hdu 3117矩陣+斐波那契數列矩陣
- 斐波那契數列的遞迴和非遞迴實現遞迴
- 斐波那契查詢
- HDU 1588 斐波那契數列數列變形和矩陣連乘矩陣
- 斐波那契數列的通項公式及證明公式
- 每日一算 -- 斐波那契數列型別題型別
- 斐波那契數列 多語言實現 筆記筆記
- js計算斐波那契數列程式碼例項JS
- HITOJ 2255 類似Fibonacci數列求和取模擴充
- python for迴圈和斐波那契Python
- fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數遞迴
- 斐波那契數(C/C++,Scheme)C++Scheme