这个2比1简单吧..
P−−√ 判一下发现模数是个质数
因为有这个公式
Fn=15√[(1+5√2)n−(1−5√2)n]
用二次剩余弄出在模这个质数下的
5√
,令
A=1+5√2,B=1−5√2
就是求
t(AN−BN)
,
N=2n
N
显然与
code:
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll mul(ll a,ll b,ll mod)
{
ll re=0;
for(;b;b>>=1,a=(a+a)%mod) if(b&1)
re=(re+a)%mod;
return re;
}
ll pw(ll x,ll k,ll mod)
{
ll re=1ll;
for(;k;k>>=1,x=mul(x,x,mod)) if(k&1ll)
re=mul(re,x,mod);
return re;
}
ll sqr(ll x,ll mod){return mul(x,x,mod);}
const ll mod = 1125899839733759;
struct E
{
ll a,b,cn;
friend inline E operator *(const E &x,const E &y)
{
return (E){
(mul(x.a,y.a,mod)+mul(mul(x.b,y.b,mod),x.cn,mod))%mod,
(mul(x.b,y.a,mod)+mul(x.a,y.b,mod))%mod,
x.cn};
}
};
struct Get_Sqrt
{
ll alpha,alphan;
ll f(ll x){return pw(x,(mod-1)>>1,mod);}
ll pw2(E x,ll k)
{
E re=(E){1,0,alphan};
for(;k;k>>=1,x=x*x) if(k&1ll)
re=re*x;
return re.a;
}
ll solve(ll n)
{
if(!n) return 0;
if(f(n)==mod-1) return -1;
alpha=0;
while(!alpha)
{
ll cc=mul(rand(),rand(),mod),cn=(sqr(cc,mod)-n+mod)%mod;
if(f(cn)==mod-1) alpha=cc,alphan=cn;
}
E x=(E){alpha,1,alphan};
return pw2(x,(mod+1)>>1);
}
}Sqrt;
ll s5,invs5,inv2=(mod+1ll)>>1,A,B;
ll n;
int main()
{
//freopen("tmp.in","r",stdin);
//freopen("tmp.out","w",stdout);
srand(23333333);
s5=Sqrt.solve(5); invs5=pw(s5,mod-2,mod);
A=mul((s5+1),inv2,mod);
B=mod-pw(A,mod-2,mod);
int tcase; scanf("%d",&tcase);
while(tcase--)
{
scanf("%lld",&n); n=pw(2,n,mod-1);
ll re=(pw(A,n,mod)-pw(B,n,mod)+mod)%mod;
re=mul(re,invs5,mod);
printf("%lld\n",re);
}
return 0;
}