某种序列
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
数列A满足An = An-1 + An-2 + An-3, n >= 3
编写程序,给定A0, A1 和 A2, 计算A99
输入
输入包含多行数据
每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000)
数据以EOF结束
输出
对于输入的每一行输出A99的值
样例输入
1 1 1
样例输出
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
数列A满足An = An-1 + An-2 + An-3, n >= 3
编写程序,给定A0, A1 和 A2, 计算A99
输入
输入包含多行数据
每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000)
数据以EOF结束
输出
对于输入的每一行输出A99的值
样例输入
1 1 1
样例输出
69087442470169316923566147
思路:是个水题,但是因为自己一开始忽视了数据,其实就是97个大数加的操作, 结果自己愣是写成了构造矩阵快速幂,还写了一个大数乘。思维定视真的很伤,还好最后写出来了,感谢兄弟的提醒T_T, 简单的方法请看点击打开链接
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int k, n;
typedef struct Matrix{
int a[10][10][55];
}Matrix;
void BigAdd(int* a, int* b)
{
int carry=0;
for(int i=1; i<=50; i++)
{
int tmp=(a[i]+b[i]+carry)/10;
a[i]=(a[i]+b[i]+carry)%10;
carry=tmp;
}
}
void BigMul(int* a, int* b, int* c)
{
int d[550];
for(int i=1; i<=50; i++)
{
memset(d, 0, sizeof(d));
for(int j=1; j<=50; j++)
{
d[i+j-1]+=b[i]*c[j];
}
BigAdd(a, d);
}
}
Matrix MatrixMul(Matrix x, Matrix y, int row, int col)
{
Matrix c;
memset(c.a, 0, sizeof(c.a));
for(int i=1; i<=row; i++)
for(int j=1; j<=col; j++)
{
for(int k=1; k<=col; k++)
{
BigMul(c.a[i][j], x.a[i][k], y.a[k][j]);
}
}
return c;
}
Matrix pow(Matrix x, int t)
{
Matrix c;
memset(c.a, 0, sizeof(c.a));
for(int i=1; i<=3; i++)
for(int j=1; j<=3; j++)
if(i==j)
c.a[i][j][1]=1;
while(t)
{
if(t&1)
{
c=MatrixMul(c, x, 3, 3);
}
x=MatrixMul(x, x, 3, 3);
t>>=1;
}
return c;
}
void initB(Matrix &tmp, int a, int b, int c)
{
int cnt;
cnt=0;
while(c)
{
tmp.a[1][1][++cnt]=c%10;
c/=10;
}
cnt=0;
while(b)
{
tmp.a[1][2][++cnt]=b%10;
b/=10;
}
cnt=0;
while(a)
{
tmp.a[1][3][++cnt]=a%10;
a/=10;
}
}
int main(){
int a, b, c;
Matrix A, B;
memset(A.a, 0, sizeof(A.a));
A.a[1][1][1]=A.a[1][2][1]=A.a[2][1][1]=A.a[2][3][1]=A.a[3][1][1]=1;
Matrix T=pow(A, 97);
while(~scanf("%d%d%d", &a, &b, &c))
{
memset(B.a, 0, sizeof(B.a));
initB(B, a, b, c);
Matrix ans=MatrixMul(B, T, 1, 3);
int k;
for(k=50; k>=1; k--)
if(ans.a[1][1][k])
break;
for(int i=k; i>=1; i--)
printf("%d", ans.a[1][1][i]);
printf("\n");
}
return 0;
}