-1
문제는 1,000000000000000000th 피보나치 번호 % 1,000,000
1 000 000 000 000 000 000 번째 피보나치 수
#include <iostream>
#define fibo(a,b) {long long c=b;b=a;a=(b+c)%1000000;}
using namespace std;
int main(){
long long a=1,b=0; //two num
long long pa,pb,n,k,arr[2][1000]; //last two num,input,input<=2^k
cin>>n;
arr[0][0]=n/2;arr[1][0]=n%2;
for(unsigned long long i=1;n>3;i++){
arr[0][i]=arr[0][i-1]/2;
arr[1][i]=arr[0][i-1]%2;
if(arr[0][i]==1){
k=i;
break;
}
}
if(n<=3){ //special occasions
switch(n){
case 0:cout<<"0"<<endl;break;
case 3:cout<<"2"<<endl;break;
default:cout<<"1"<<endl;
}
return 0;
}
while(k>=0){ //calc
pa=a;pb=b;
a=((pa+pb*2)*pa)%1000000; //F(2n)=(F(n)+F(n-1)*2)*F(n)
b=(pa*pa+pb*pb)%1000000; //F(2n-1)=F(n)^2+F(n-1)^2
if(arr[1][k--]==1){fibo(a,b);} //F(n+1)=F(n)+F(n-1)
}
cout<<a<<endl;
return 0;
}
가 잘못에서 얻을입니까? 왜 잘못 되었나요?
다른 경우를 찾을 수 없습니다.
n 번째 피보나치 수에 대한 [닫힌 공식 방정식] (https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression)이 있습니다. 모두 계산할 필요가 없습니다. –
대답에 감사하지만 정수가 필요합니다. float가 아닙니다. – stoad
이것은 n 번째 피보나치 수에 대한 수식입니다. 바로 정수입니다. 나는 당신의 코멘트가 무엇을 의미하는지 전혀 모른다. –