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 2034 人见人爱A-B
HDOJ 2034 人见人爱A-B
110 0
HDOJ 2050 折线分割平面
HDOJ 2050 折线分割平面
110 0
HDOJ 2050 折线分割平面
HDOJ 1412 {A} + {B}
HDOJ 1412 {A} + {B}
89 0
|
机器学习/深度学习
HDOJ 2074 叠筐
HDOJ 2074 叠筐
96 0
|
安全
HDOJ 2022 海选女主角
HDOJ 2022 海选女主角
130 0
|
人工智能 Java BI
|
Java 机器学习/深度学习
HDOJ 1214 圆桌会议
Problem Description HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有解决不了的问题,这也只有HDU ACM集训队特有的圆桌会议,有一天你也...
784 0