hdu 1005 (规律 循环节)
题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
求 f(n)
思路:
这题根据公式可以得出规律
当出现 1 1时 表示达到循环节点
因此可以打表求余得出结果
但是至于为什么49 是最大周期
找到了点资料是说
每个数是有前两个数来决定
而数的结果只有0 到6 七种可能
因此是 7*7=49
#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(scanf("%d%d%d",&a,&b,&n),a||b||n)
{
int i,j;
int l1,len;
for(i=3;i<10000;i++)
{
arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
for(j=1;j<=i-1;j++)
{
if(arr[i]==arr[j]&&arr[i-1]==arr[j-1])
{
l1=j-1;
len=i-j;
break;
}
}
}
if(n>=l1)
{
n=(n-(l1-1))%len+(l1-1);
}
arr[0]=arr[len+l1-1];
cout << arr[n] << endl;
}
return 0;
}
重新看了题解 还是想不通为什么循环节在 1 1 又写了个自己判断循环节的
#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(scanf("%d%d%d",&a,&b,&n),a||b||n)
{
int i,j;
int l1,len;
for(i=3;i<10000;i++)
{
arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
for(j=1;j<=i-1;j++)
{
if(arr[i]==arr[j]&&arr[i-1]==arr[j-1])
{
l1=j-1;
len=i-j;
break;
}
}
}
if(n>=l1)
{
n=(n-(l1-1))%len+(l1-1);
}
arr[0]=arr[len+l1-1];
cout << arr[n] << endl;
}
return 0;
}

浙公网安备 33010602011771号