HDOJ 1005

简介: 1 #include 2 int main() 3 { 4 int f[200],a,b,n,i; 5 while(scanf("%d%d%d",&a,&b,&n),a||b||n) 6 { 7 if(n>2) 8 ...
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int f[200],a,b,n,i;
 5     while(scanf("%d%d%d",&a,&b,&n),a||b||n)
 6     {
 7         if(n>2)
 8         {
 9             f[1]=f[2]=1;
10             for(i=3;i<200;i++)
11             {
12                 f[i]=(a*f[i-1]+b*f[i-2])%7;
13                 if(f[i-1]==1&&f[i]==1)
14                     break;
15             }
16             i-=2;//LPP,最小正周期
17             n=n%i;//比如1~5是个循环周期,f(6)=f(1)、
18             if(n==0)
19                 printf("%d\n",f[i]);
20             else
21                 printf("%d\n",f[n]);
22         }
23         else
24             printf("1\n");
25     }
26     return 0;
27 }

//有个错觉,既然n是一亿,又怎么能用整形输入呢,必须需字符串,实际上是错误的,2^31-1达到

 

了21亿

//和递归相比主要是求出了LPP,减少了不必要的运算次数

 

 

 

 

 

 

 

//栈耗尽,因为n可以到一亿

#include<stdio.h>

int Calc_n(int A,int B,int n)

{

int m,p;

if(1==n||2==n)

return 1;

else

{

m=A*Calc_n(A,B,n-1);

p=B*Calc_n(A,B,n-2);

return (m%7+p%7)%7;

}

 

}

int main()

{

int A,B,n;int ans;

while(scanf("%d%d%d",&A,&B,&n),A||B||n)

ans=Calc_n(A,B,n);

printf("%d\n",ans);

return 0;

}

 

 

 

 

 

(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

 

很明显这是一道找规律的题目。

 

用到模数的一个性质 (a*b)%m=(a%m * b%m)%m, (a+b)%m=(a%m+b%m)%m

 

由此 f(n)=(A%7*f(n-1)+B%7*f(n-2))%7

 

虽然1 <= A, B <= 1000,但是A%7与B%7的值的范围只有0~6,也就是说共有49种情况,代入个数手工

 

推算一下,可以发现

 

f(n)会出现循环(这个是必然的)

 

 

}

 
目录
相关文章
HDOJ 2041 超级楼梯
HDOJ 2041 超级楼梯
107 0
HDOJ 1323 Perfection(简单题)
HDOJ 1323 Perfection(简单题)
127 0
HDOJ 2033 人见人爱A+B
HDOJ 2033 人见人爱A+B
160 0
|
安全
HDOJ 2022 海选女主角
HDOJ 2022 海选女主角
155 0
|
机器学习/深度学习 网络协议 缓存
HDOJ 2802 F(N)
Problem Description Giving the N, can you tell me the answer of F(N)? Input Each test case contains a single integer N(1
720 0
HDOJ 2056 Rectangles
Problem Description Given two rectangles and the coordinates of two points on the diagonals of each rectangle,you have to calculate the area of the intersected part of two rectangles.
1012 0