原题链接1http://oi.nks.edu.cn/zh/Problem/Details?cid=2366&tid=A原题链接2
http://oi.nks.edu.cn/zh/Problem/Details/1894
时间限制 : 10000 MS 空间限制 : 65536 KB
问题描述
斐波拉楔数列的形式为 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
给出一个整数n,请求出斐波拉楔数列的第n项mod 10000。
输入格式
有多组输入数据,以-1作为结束。
每组数据包含一个整数n(0 ≤ n ≤ 1,000,000,000)
输出格式
对于每组数据,输出一行,一个整数表示斐波拉写数列第n项的最后四位。
样例输入
0
9
999999999
1000000000
-1
样例输出
0
34
626
6875
方法分析
矩阵乘法
只有这样才不会超时
代码实现
//勿抄题解
#include<bits/stdc++.h>//习惯性的使用万能头文件
using namespace std;
const int N=10+5;
const int M=1e4;
int n,t;
struct arr{
int a[N][N];
arr(){
memset(a,0,sizeof a);
}
arr operator*(const arr&T)const{
arr cnt;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++){
cnt.a[i][j]+=a[i][k]*T.a[k][j];
cnt.a[i][j]%=M;
}
return cnt;
}
}x,y;//结构体
void ksm(int k){
while(k){
if(k&1) x=x*y;//位运算
y=y*y;
k=k>>1;
}
}
int main(){
while(scanf("%d",&n)){//输入,记住别用cin(我用cin错了,不知道哪里错的)
if(n==-1) return 0;
else if(n==0){
cout<<"0"<<endl;
}
else if(n==1){
cout<<"1"<<endl;
}
else if(n==2){
cout<<"1"<<endl;
} //特判
else{
memset(x.a,0,sizeof x.a);
memset(y.a,0,sizeof y.a);
y.a[1][1]=1;
y.a[1][2]=1;
y.a[2][1]=1;
x.a[1][1]=1;
x.a[1][2]=1;
ksm(n-2);
printf("%d\n",x.a[1][1]%M);
}
}
return 0;
}//主函数