首页 > 其他 > 详细

hdu 1005

时间:2014-08-20 02:30:55      阅读:275      评论:0      收藏:0      [点我收藏+]

这题根据公式可以得出规律 

当出现 1 1时 表示达到循环节点

因此可以打表求余得出结果

但是至于为什么49 是最大周期

 

找到了点资料是说

每个数是有前两个数来决定

而数的结果只有0 到6 七种可能

因此是 7*7=49

 

只能意会了 而且还出现了奇怪的bug 把for循环换成while就一直wa 

如果只有49次不是应该break的吗 为什么会re

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;
int arr[10000];
int main()
{
     arr[1]=arr[2]=1;       
     int a,b,n;     
    while(cin>>a>>b>>n,a||b||n)
    {
         int i;
        for(i=3;i<10000;i++)
        {
            arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
            if(arr[i]==1&&arr[i-1]==1) break;
        }             
		
        n=n%(i-2);
        arr[0]=arr[i-2];
        cout << arr[n] << endl;
   
    }
    return 0;
}

  

 

以下是re代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll __int64
#define MAXN 1000
#define INF 0x7ffffff
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int num[10000];
int main()
{
     num[1]=1;
     num[2]=1;
     int i,j;
     int a,b,que;
     int flag;
    while(scanf("%d%d%d",&a,&b,&que)!=EOF)
    {
        if(a==0&&b==0&&que==0) break;
        i=3;
        while(1)
        {
            num[i]=(a*num[i-1]+b*num[i-2])%7;
            if(num[i]==1&&num[i-1]==1) break;
            i++;
        }
        flag=i-2;
        if(que%flag)
        printf("%d\n",num[que%flag]);
        else
            printf("%d\n",num[flag]);
    }
    return 0;
}

  

hdu 1005,布布扣,bubuko.com

hdu 1005

原文:http://www.cnblogs.com/sola1994/p/3923647.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!