質問の意味:
番号膜10000のN項目Fのフィボナッチ[N] F [N]である%10000シーク
10億≤が、0≤nは
式を与えました:
分析:
行列A 1の乗図マトリクス高速パワーN-1は、最初の列の最初の行番号は答えは、3です。
(モジュロを覚えておいてください)
以下は、コード・ボードとの交流であります
クイックマトリックスボードの電源にコピー:
const int maxm=1e3+5;
struct Matrix{
int a[maxm][maxm];
}res,ans;
Matrix mul(Matrix A,Matrix B,int n){//矩阵A,B和阶数n
Matrix temp;//临时存放答案的矩阵
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
temp.a[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
temp.a[i][j]+=(A.a[i][k]%mod)*(B.a[k][j]%mod);
temp.a[i][j]%=mod;
}
}
}
return temp;
}
void quickpower(int N,int n){//N是幂数,n是阶数
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans.a[i][j]=(i==j?1:0);
}
}
while(N>0){
if(N&1){
ans=mul(ans,res,n);
}
res=mul(res,res,n);
N>>=1;
}
}
コード:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxm=3;
const int mod=1e4;
struct Matrix{
int a[maxm][maxm];
}res,ans;
Matrix mul(Matrix A,Matrix B,int n){
Matrix temp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
temp.a[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
temp.a[i][j]+=(A.a[i][k]%mod)*(B.a[k][j]%mod);
temp.a[i][j]%=mod;
}
}
}
return temp;
}
void quickpower(int N,int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans.a[i][j]=(i==j?1:0);
}
}
while(N>0){
if(N&1){
ans=mul(ans,res,n);
}
res=mul(res,res,n);
N>>=1;
}
}
int main(){
int n;
while(cin>>n){
if(n==-1)break;
if(n==0){
cout<<0<<endl;
continue;
}
if(n==-1)break;
res.a[1][1]=res.a[1][2]=res.a[2][1]=1;
res.a[2][2]=0;
quickpower(n-1,2);
cout<<ans.a[1][1]<<endl;
}
return 0;
}