代码在我的翻译上工作得非常好,但是给了NZEC一个黑色的。
cases = int(raw_input())
for i in xrange(cases):
k = 0
n,m = map(int, sys.stdin.readline().split())
sq5 = Decimal(sqrt(5))
phi = (1 + sq5)/2 #Refer wikipedia page for calculating fibonacci numbers
print (int(Decimal(phi)**(m+2)/sq5 + Decimal(0.5)) - int(Decimal(phi)**(n+1)/sq5 + Decimal(0.5)))%1000000007
我做错了什么?
答案 0 :(得分:0)
这可能是由于 OverflowError
当10 ^ 9中的m值非常大时,内置 pow()函数(即**运算符)的效果不如预期。
>>> (1.1)**1000000000
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
1.1**(100000000)
OverflowError: (34, 'Numerical result out of range')
即使 math.pow()也无效。
>>> import math
>>> math.pow(1.1,1000000000)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
math.pow(1.1,1000000000)
OverflowError: math range error
而是使用Matrix方法代替 Binet的Fibonacci公式来通过 O(ln m)。在 Binet的公式中为权力创造天真的功能可能最终会达到 O(m)
答案 1 :(得分:0)
检查我的代码也是: #包括 使用命名空间std;
#define mod 1000000007
long long result[2][2]={{1,1},{1,0}};
long long transformation[2][2]={{1,1},{1,0}};
void matrixMul(long long a[2][2],long long b[2][2])
{
int i,j,k;
long long re[2][2] ={0};
for(i=0;i<2;i++) {
for(j=0;j<2;j++) {
for(k=0;k<2;k++) {
re[i][j] = (re[i][j] + (a[i][k]*b[k][j])%mod ) % mod;
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
result[i][j]=re[i][j];
}
}
void initialize() {
result[0][0]=result[0][1]=result[1][0]=1;
result[1][1]=0;
}
void power(int n)
{
if(n==1)
return ;
power(n/2);
matrixMul(result,result);
if(n&1)
{
matrixMul(result,transformation);
}
}
int main()
{
int t;
cin>>t;
while(t--){
initialize();
long long n,m;
cin>>n>>m;
long long x,y;
if(n == 0 || n == 1) {
x=n;
}
else {
power(n);
x=result[0][0]-1;
}
initialize();
if(m == 0 || m == 1) {
x=m;
}
else {
power(m+1);
y=result[0][0]-1;
}
if(x>y){
x=x-y;
}
else
x=y-x;
cout<<((x+mod)%mod)<<endl;
}
return 0;
}