AOJ-AHU-OJ-662 越来越快

越来越快
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Description
Viky最近对数列有很大的兴趣,比如斐波那契数列。但研究斐波那契数列的人太多了,Viky决定用递推公式定义一种新的数列,并命名为Viky数列。Viky数列定义如下:
V(1) = X, V(2) = Y;
V(n) = A * V(n-2) + B * V(n-1), n≥3;

问:给出整数m,问Viky数列的前m项和sum。

Input
第1行:测试数据组数t;
接下来依次是这t组数据,对于每一组数据:
第1行:X Y A B,有X,Y,A,B≥0;
第2行:m, m≥0。

Output
一共t行,第i行对于第i组数据的答案。

Sample Input
Original Transformed
1
1 2 1 1
6

Sample Output
Original Transformed
32

Hint
所给数据及最后的结果sum均为整数,且保证取值范围都在区间[0,2 31)内。

————————————————————忧桑的分割线————————————————————
思路:很简单不是吗?但是,为什么你会RE这么多次?数组不够大?应该是根本存不下。
考虑A = 0且B = 0的时候,然后给你一个m = 1000000000。
对嘛,A、B是2以上的时候f[ ]递增越来越快,很快就会超过2147483647。也就是说这个时候数据中的m会很小。
反之就不一定了。加上很多的判定吧。分类讨论XYAB
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int f[50];
int main(){
    int cas;
    int X,Y,A,B;
    long long sum, m;
    scanf("%d", &cas);
    while(cas--){
        scanf("%d%d%d%d%lld", &X, &Y, &A, &B, &m);
        f[0] = X;
        f[1] = Y;
        sum = X + Y;
        if(m == 1)  printf("%d\n", X);
        else if(m == 2)  printf("%lld\n", sum);
        else if(!m || !X && !Y)  printf("0\n");
        else if(!A && !B)  printf("%lld\n", sum);
        else if(B == 1 && !A)  printf("%lld\n", X + Y*(m-1));
        else if(A == 1 && !B){
            if(m%2==0)  sum = (X+Y) * (m>>1);
            else  sum = (X+Y)*(m>>1) + X;
            printf("%lld\n", sum);
        }
        else{
            for(int i = 2; i < m; i++){
                f[i] = A * f[i-2] + B * f[i-1];
                sum += f[i];
            }
            printf("%lld\n", sum);
        }
    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值