胡萝卜 题解

兔子经常感到饥饿,所以当他们外出吃胡萝卜时,他们会尽快跳起来。 
胡萝卜种植在一条数轴上。

最初,兔子站在整数位置init。设兔子当前位置在整数x,她可以在单次跳跃中跳到位置4 * x+3或位置8 * x+7。它最多可以跳跃100000次。 

胡萝卜种植在x位置,当且仅当x可被1000000007整除时(即胡萝卜种植在0号位置,位置1000000007,位置2000000014,依此类推)。

输出兔子能吃到胡萝卜所需的最小跳跃次数。如果使用最多100,000次跳跃无法获得胡萝卜,则返回-1。     

 

输入格式

多组测试数据。

第一行,一个整数G,表示有G组测试数据。 1 <= G <= 5

每组测试数据格式: 

    第一行,一个整数:init。 1<=init<=1000000006

 

输出格式:

共G行,每行一个整数。

测试点时限:5s

        我们把4 * x+3叫做操作A,8 * x+7叫做操作B

  由于数据巨大,所以不能模拟!!!

  只好手动推规律:  

  A=4*x+3,AA=16*x+15,AAA=64*x+63……

      B=8*x+7,BB=64*x+63……

    这时发现AAA=BB,因为求最小跳跃次数,所以最小跳跃方式一定为b个B和a个A(a<3),所以我们枚举b就可以

#include<iostream>
#include<fstream> 
#include<cmath>
#include<cstdio>
using namespace std;
long long x,mod=1000000007,ans=100000+10,g;
int main()
{
    scanf("%lld",&g);
    while (g--)
    {
        scanf("%lld",&x);
        ans=100000+10;
       for (int i=1;i<=50000;i++)
       {
         if ((4*x+3)%mod==0)if (ans>2*(i-1)+1)ans=2*(i-1)+1;
         if ((16*x+15)%mod==0)if (ans>2*(i-1)+2)ans=2*(i-1)+2;
         if ((8*x+7)%mod==0)if (ans>2*(i-1)+1)ans=2*(i-1)+1;
         if ((32*x+31)%mod==0)if (ans>2*(i-1)+2)ans=2*(i-1)+2;
         if ((128*x+127)%mod==0)if (ans>2*(i-1)+3)ans=2*(i-1)+3;
         x=(64*x+63)%mod;
         if (x==0)
         {
            ans=2*i;break;
         }
       }
       //printf("%lld %lld %lld %lld %lld\n",(4*x+3)%mod,(16*x+15)%mod,(8*x+7)%mod,(64*x+63)%mod,ans);
      if (ans>100000)printf("-1\n");
      else printf("%lld\n",ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/hao-jun/p/10718201.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值