兔子经常感到饥饿,所以当他们外出吃胡萝卜时,他们会尽快跳起来。
胡萝卜种植在一条数轴上。
最初,兔子站在整数位置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; }