模拟高精度。
第一天由于输入的时候判断是否为0,结果果断超时。额。。。结果第二天重新写的时候马上AC了。泪奔!
CODE:
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn = 535;
int fibo1[maxn];
int fibo2[maxn];
int fibo3[maxn];
int fibo4[maxn];
int result[maxn];
void output() //输出
{
int i;
for(i = maxn -1; i >= 0 && result[i] == 0; i--);
printf("%d", result[i--]); //不输出前导0
for(; i >= 0; i--)
{
printf("%04d", result[i]);
}
printf("\n");
return ;
}
void init() //预处理
{
memset(fibo1, 0, sizeof(fibo1));
memset(fibo2, 0, sizeof(fibo2));
memset(fibo3, 0, sizeof(fibo3));
memset(fibo4, 0, sizeof(fibo4));
memset(result, 0, sizeof(result));
return ;
}
int main()
{
int n;
while(~scanf("%d", &n)) //while(~scanf("%d", &n), n) 果断超时。
{
int i, j;
if(n <= 4)
{
printf("1\n");
continue;
}
init(); //预处理
fibo1[0] = fibo2[0] = fibo3[0] = fibo4[0] = 1;
int carry = 0; //进位
for(i = 5; i <= n; i++) //模拟加法
{
for(j = 0; j < maxn; j++)
{
result[j] = fibo1[j]+fibo2[j]+fibo3[j]+fibo4[j] + carry;
carry = result[j] / 10000;
result[j] -= carry*10000;
}
memcpy(fibo1, fibo2, sizeof(fibo1));
memcpy(fibo2, fibo3, sizeof(fibo2));
memcpy(fibo3, fibo4, sizeof(fibo3));
memcpy(fibo4, result, sizeof(fibo4)); // 迭代
}
output();
}
return 0;
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn = 535;
int fibo1[maxn];
int fibo2[maxn];
int fibo3[maxn];
int fibo4[maxn];
int result[maxn];
void output() //输出
{
int i;
for(i = maxn -1; i >= 0 && result[i] == 0; i--);
printf("%d", result[i--]); //不输出前导0
for(; i >= 0; i--)
{
printf("%04d", result[i]);
}
printf("\n");
return ;
}
void init() //预处理
{
memset(fibo1, 0, sizeof(fibo1));
memset(fibo2, 0, sizeof(fibo2));
memset(fibo3, 0, sizeof(fibo3));
memset(fibo4, 0, sizeof(fibo4));
memset(result, 0, sizeof(result));
return ;
}
int main()
{
int n;
while(~scanf("%d", &n)) //while(~scanf("%d", &n), n) 果断超时。
{
int i, j;
if(n <= 4)
{
printf("1\n");
continue;
}
init(); //预处理
fibo1[0] = fibo2[0] = fibo3[0] = fibo4[0] = 1;
int carry = 0; //进位
for(i = 5; i <= n; i++) //模拟加法
{
for(j = 0; j < maxn; j++)
{
result[j] = fibo1[j]+fibo2[j]+fibo3[j]+fibo4[j] + carry;
carry = result[j] / 10000;
result[j] -= carry*10000;
}
memcpy(fibo1, fibo2, sizeof(fibo1));
memcpy(fibo2, fibo3, sizeof(fibo2));
memcpy(fibo3, fibo4, sizeof(fibo3));
memcpy(fibo4, result, sizeof(fibo4)); // 迭代
}
output();
}
return 0;
}