hdu3054(斐波那契。。。。找规律)

202 篇文章 0 订阅
154 篇文章 0 订阅

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)
 

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.
 

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);
 

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值