求斐波那契数的一个取模运算的问题
先贴上我有问题的代码,时在51nod上做求斐波那契数的问题。
#include <iostream>
using namespace std;
long long int C[2][2]={{1,1},{1,0}};
void matrixmultiply(long long int a[][2],long long int b[][2]);
void fibonacci(long long int a[][2],long long int n){
if(n%2==0){
if(n==0){
a[0][0]=1;
a[0][1]=0;
a[1][0]=0;
a[1][2]=1;
return ;
}
fibonacci(a,n/2);
matrixmultiply(a,a);
}
else{
fibonacci(a,(n-1)/2);
matrixmultiply(a,a);
matrixmultiply(a,C);
}
}
void matrixmultiply(long long int a[][2],long long int b[][2]){
long long int c[2][2],d[2][2];
for(int i=0;i<2;++i)
for(int j=0;j<2;++j){
c[i][j]=a[i][j];
d[i][j]=b[i][j];
}
long long int temp=0;
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
{
for(int k=0;k<2;++k)
temp+=c[i][k]*d[k][j];
a[i][j]=temp%1000000009;
//在这里temp不加%1000000009和加了之后计算结果不同
//这是为什么?
cout<<temp<<" "<<a[i][j]<<endl;
temp=0;
}
}
int main(){
long long int a[2][2]={{1,1},{1,0}};
long long int N;
cin>>N;
fibonacci(a,N);
cout<<a[0][3]%1000000009<<endl;
return 0;
}
在写matrixmultiply函数时候我有两种不同的做法(只贴局部代码),第一种是
a[i] [j]=temp%1000000009;
cout<<temp<<" "<<a[i] [j]<<endl;
这样能通过测试点;
但是第二种做法就不行,代码如下:
a[i] [j]=temp;
cout<<temp<<" "<<a[i] [j]%1000000009<<endl;
两种做法的在N=220的输出为:
(1)
(2)
仅仅是对temp取模,但是没有给temp赋值,但是却改变了temp的值,这是为什么?很是想不明白,希望大家能指点我,多谢了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论