这个序列满足 a(n+2) = 2 a(n+1) + 2 a(n)。
还有a(n)=[(1+sqrt(3))^(n+2)-(1-sqrt(3))^(n+2)]/(4sqrt(3))。
我正在使用 C++,n 可以在 1 到 10^9 之间变化。我需要模 (10^9)+7 的答案,但这里的速度非常重要
对于 > 10^7 的数字,我的公式 1 代码很慢
#include <iostream>
#define big unsigned long long int
#include<stdlib.h>
int ans[100000001]={0};
big m =1000000007;
using namespace std;
int main()
{
//cout << "Hello world!" << endl;
big t,n;
cin>>t;
big a,b,c;
a=1;
b=3;
c=8;
ans[0]=0;
ans[1]=1;
ans[2]=3;
ans[3]=8;
for(big i=3;i<=100000000;i++)
{
ans[i]=(((((ans[i-2])+(ans[i-1])))%m)<<1)%m;
}
// while(t--)
// {
// int f=0;
// cin>>n;
// if(n==1){
// cout<<1<<endl;f++;}
// if(n==2){
// cout<<3<<endl;
// f++;
// }
// if(!f){
// a=1;
// b=3;
// c=8;
// for(big i=3;i<=n;i++)
// {
// c=(((((a)+(b
// )))%m)<<1)%m;
// a=b%m ;
// b=c%m;
// }
// cout<<ans[n]<<endl;
// }
// }
while(t--)
{
cin>>n;
if(n<=100000000)
cout<<ans[n]<<endl;
else
cout<<rand()%m;
}
return 0;
}
我想要一个更快的方法。如何使用第二个公式计算第 n 项。是否有任何技巧可以快速计算小数的模幂?你对更快地生成这个序列有什么建议吗?
请帮忙