Problem Description
We know the Fibonacci Sequence
F1=1,F2=1,F3=2,F4=3,F5=5,
...
Fx = Fx-1+Fx-2
We want to know the Mth number which has K consecutive "0" at the end of Fx.
For example,
F15=610
It is the first number which has only one "0" at the end.
F300=222232244629420445529739893461909967206666939096499764990979600.
It is the second number which has two "0" at the end.
Of course, the Fx may be very large if M and K are big. So we only want to know the subscript of Fx (it means the "x" For a given M and K)
F1=1,F2=1,F3=2,F4=3,F5=5,
...
Fx = Fx-1+Fx-2
We want to know the Mth number which has K consecutive "0" at the end of Fx.
For example,
F15=610
It is the first number which has only one "0" at the end.
F300=222232244629420445529739893461909967206666939096499764990979600.
It is the second number which has two "0" at the end.
Of course, the Fx may be very large if M and K are big. So we only want to know the subscript of Fx (it means the "x" For a given M and K)
Input
Input includes multiple cases.
First line is the number of case x
The next x lines: Each line contains two integer number, K and M, divided by a space.
First line is the number of case x
The next x lines: Each line contains two integer number, K and M, divided by a space.
Output
For each case:
Print a integer number in a line, is the Mth number which has K consecutive 0s at the end of Fx. (You can believe the answer is smaller than 2^31);
Print a integer number in a line, is the Mth number which has K consecutive 0s at the end of Fx. (You can believe the answer is smaller than 2^31);
Sample Input
3 1 1 2 2 2 5
Sample Output
15 300 900
打表。。。。这题代码量比较少,但还是很考验找规律能力的,而且!!!
眼力必须好啊!
下面是我的打表代码,输入n代表末尾n个0:
#include <iostream>
using namespace std;
int pp(int n)
{
int ans=1;
for(int i=0;i<n;i++)
ans*=10;
return ans;
}
int f[100000000]={0};
int main()
{
int n;
while(cin>>n)
{
int p0=pp(n),p1=pp(n+1),t=1;
f[1]=1;
for(int i=2;i<100000000;i++)
{
f[i]=(f[i-1]+f[i-2])%p1;
if(f[i]%p0==0&&f[i]!=0)
{
cout<<i<<"th feibo "<<t++<<"th number"<<endl;
}
if(t==50)break;
}
}
return 0;
}
运行完打表代码之后会发现1,3,4,5,6,7,……都是到第9个数增量是有一个变化!
而2是到第4个数增量有了变化!(说实话真的很难仔细一直看到第9个!!能看出2都很不错了)
然后就是找规律了,这个自己都能写的!
#include <iostream>
#include <stdio.h>
#include<string.h>
using namespace std;
int pp(int n)
{
int ans=1;
for(int i=0;i<n;i++)
ans*=10;
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int k,m;
scanf("%d%d",&k,&m);
if(k==1)
{
printf("%d\n",15*(((m-1)/9)*10+1)+15*((m-1)%9));
}
else if(k==2)
{
printf("%d\n",150*((m-1)/4*5+1)+150*((m-1)%4));
}
else
{
printf("%d\n",75*pp(k-2)*(((m-1)/9)*10+1)+75*pp(k-2)*((m-1)%9));
}
}
return 0;
}