結果
| 問題 |
No.534 フィボナッチフィボナッチ数
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2018-09-22 12:14:53 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,389 bytes |
| コンパイル時間 | 815 ms |
| コンパイル使用メモリ | 78,368 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-18 08:54:52 |
| 合計ジャッジ時間 | 1,896 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 42 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
const ll MOD=1e9+7;
ll mulmod(ll a, ll b, ll m){
ll x=1000000000;
if(m<x) return a*b%m;
ll m1=m/x, m2=m%x, a1=a/x, a2=a%x, b1=b/x, b2=b%x;
ll q1=a1*b1/m1, r1=a1*b1%m1;
ll c=r1*x+a1*b2+a2*b1-q1*m2, d=a2*b2;
ll q2, r2;
if(c<0) q2=-(-c+m1)/m1;
else q2=c/m1;
r2=c-q2*m1;
ll ans=r2*x+d-q2*m2;
if(ans<0) ans=(m-(-ans%m))%m;
else ans%=m;
return ans;
}
ll fib(ll k, ll m){
ll a[4]={0, 1, 1, 1}, ans[4]={1, 0, 0, 1};
while(k>0){
if(k%2==1){
ll b[4]={mulmod(ans[0], a[0], m)+mulmod(ans[1], a[2], m), mulmod(ans[0], a[1], m)+mulmod(ans[1], a[3], m), mulmod(ans[2], a[0], m)+mulmod(ans[3], a[2], m), mulmod(ans[2], a[1], m)+mulmod(ans[3], a[3], m)};
for(int i=0; i<4; i++) ans[i]=b[i]%m;
}
ll b[4]={mulmod(a[0], a[0], m)+mulmod(a[1], a[2], m), mulmod(a[0], a[1], m)+mulmod(a[1], a[3], m), mulmod(a[2], a[0], m)+mulmod(a[3], a[2], m), mulmod(a[2], a[1], m)+mulmod(a[3], a[3], m)};
for(int i=0; i<4; i++) a[i]=b[i]%m;
k/=2;
}
return ans[1]%m;
}
int main()
{
ll n;
cin>>n;
ll n1=fib(n, MOD*MOD-1);
cout<<fib(n1, MOD)<<endl;
return 0;
}
chocorusk