Fib[0]=0,Fib[1]=1,Fib[n]=Fib[n-1]+Fib[n-2] if n>1.
定义索函数Sor(n)=Fib[0]| Fib[1] |Fib[2]|…|Fib[n].
给定整数n,要求计算Sor(n)%1,000,000,007(1e9+7).
Input
第1行:给出一个整数T,表示有T组数据。(1<=T<=10000) 第2行到T+1行,每行一个整数n。(0<=n<=10^10)
Output
对于每个测试用例,输出结果占一行。
Input示例
2 1 2
Output示例
1 1
#include <bits/stdc++.h>
#define MOD 1000000007
#define maxn 505
#define INF 1e18
using namespace std;
typedef long long ll;
ll num[100];
void solve(ll d){
d++;
ll ans = 1, p = 2;
while(d){
if(d&1)
(ans *= p) %= MOD;
(p *= p) %= MOD;
d >>= 1;
}
(ans = ans - 1 + MOD) %= MOD;
printf("%I64d\n", ans);
}
int main(){
// freopen("in.txt", "r", stdin);
num[0] = 0;
num[1] = 1;
for(int i = 2; i <= 90; i++)
num[i] = num[i-1] + num[i-2];
int t;
scanf("%d", &t);
while(t--){
ll n;
scanf("%I64d", &n);
if(n == 0)
puts("0");
else if(n <= 90){
solve(log2(num[n]));
}
else{
solve(log2(sqrt(5)/5) + n * log2((1+sqrt(5))/2));
}
}
return 0;
}