ACM之HDOJ1005

先分析一下题,题目的意思很简单,就是给定ABn的值去求第n项的值!看到这道题先开始肯定会认为是递归,但看看数据的范围,就别想着去递归解决它,这么大数据,递归要算到何年何月,早就TLE了,其实这道题就是找规律, 或许谈不上什么高深的规律,这个规律每个人都懂,就是取余的时候肯定是存在循环的,有了这个思路,现在看看题目,是不是思路一片开阔了呢?问题是怎么找到重复呢?初始条件,f[1] = 1; f[2] = 1;当我们找到一个i  使得f[i] = 1; f[i-1] = 1;那么问题不就解决了吗?接下来是要找到循环基数,当f[i] = 1并且f[i-1] = 1,这时候循环基数就是i-2;然后让n去对i-2取余,得到的值去f就可以了,代码如下:

/**
*@author:StormMaybin
*@Date:20160426
*@Filename:HDOJ1005.c
*@<description></desciption>
*/
# include <stdio.h>
int main (void)
{
    int f[200];
    int A, B, n;
    int i;
    while (scanf ("%d %d %d",&A, &B, &n) == 3 && A || B || n)
    {
        if (n > 2)
        {
            f[1] = 1;
            f[2] = 1;
            for (i = 3; i < 200; i++)
            {
                f[i] = (A*f[i-1] + B*f[i-2]) % 7;
                if (f[i] == 1 && f[i-1] == 1)
                {
                    break;
                }
            }
            i -= 2;
            n = n%i;
            if (n == 0)
            {
                printf ("%d\n",f[i]);
            }
            else
            {
                printf ("%d\n",f[n]);
            }
        }
        else
        {
            printf ("1\n");
        }
    }
    return 0;
}




  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值