求c语言厉害的高手解答啊
题目
Description
Fib数列是这样的数列: 1,1,2,3,5,8,13,21,,,,,,. 你能确定它的第n项吗,假设它的第n项为N,你需要编程解决对于另一个输入数M,N % M的值.
Input
第一行有用空格隔开的两个整数T,M.
以下有T行数据,每行表示Fib数列的第n项.
对于所有输入的数有 1 <= input_number <= 33000000 .
Output
对于每个n,输出N%M.
ps:测试数据那么大,真不想让人活啊!!
[解决办法]
算啦 一下午了也没人做出来 丢个代码去睡觉了 欢迎各位测试我的代码 输入数据的格式前面的帖子已经说了 算法的时间复杂度 O(logn)
输入包含多组测试数据。
每组数据占一行,仅包含一个整数n(0≤n≤1,000,000,000)最后一行为整数-1代表输入结束,不需要做处理。
输出
对于每组测试数据,输出FN模10000的余数。
#include <stdio.h>
struct Matrix
{
int _11,_12;
int _21,_22;
};
void Ride(const Matrix *src1,const Matrix *src2,Matrix *out)
{
out->_11 = (src1->_11*src2->_11 + src1->_12*src2->_21)%10000;
out->_12 = (src1->_11*src2->_12 + src1->_12*src2->_22)%10000;
out->_21 = (src1->_21*src2->_11 + src1->_22*src2->_21)%10000;
out->_22 = (src1->_21*src2->_12 + src1->_22*src2->_22)%10000;
}
void Power(Matrix *src,int n,Matrix *out)
{
Matrix one = {1,1,1,0};
if(n == 1)
{
*out = one;
return ;
}
Power(src,n>>1,out);
Matrix temp = *out;
Ride(&temp,&temp,out);
if(0 == n%2)
return ;
else
{
temp = *out;
Ride(&temp,&one,out);
}
}
int main()
{
int i,j,n;
while(scanf("%d",&n) && n >=0)
{
if(0 == n
[解决办法]
1 == n)
{
printf("%d\n",n);
continue;
}
Matrix m1 = {1,1,1,0},res;
Power(&m1,n-1,&res);
printf("%d\n",res._11);
}
return 0;
}