/*******************8
f(x)=4x+3 g(x)=8x+7 观察有f(f(f(x)))=g(g(x))
那么尽量用g(x)替换f(x),得到f(x)的个数可以取0,1,2个
然后暴力10w*3次就可以了。
****************************************************/
蹦蹦跳跳的Rabbit大神分数:
题目描述
关于兔子~蹦蹦跳跳的兔子~谨以此题膜拜Rabbit大神。
话说小兔兔跳得很远,如果他处于位置x,则他能跳到4x+3或8x+7的位置,但是由于环境不好,只有%1,000,000,007=0的位置才有草。
但是小兔兔很饿,他最多只能跳100,000次,问,他最少需要跳几次才能吃到草?
如果他吃不到草,输出-1。
假设小兔兔的位置是281250001,则他先跳到1125000007(4x+3),再跳到9000000063(8x+7)。9000000063=9*1000000007。所以需要跳两次。
输入格式
一个数x,表示小兔兔的位置,n<1,000,000,007
输出
一个数,最少跳的次数,如果在规定步数内吃不到草输出-1.
样例输入
125000000
281250001
样例输出
1
2
#include<stdio.h>
const int maxn=1000000007;
int main(void)
{
long long x, m;
int cnt;
int temp;
while(scanf("%lld", &m)!=EOF){
cnt=0; temp=0;
x=m;
for(int i=0; i<=100000; i++)
{
if(x%maxn==0)
{
temp=1;
break;
}
else
{
x=(8*x+7)%maxn;
cnt++;
}
}
if(temp==0)
{
x=m;
cnt=0;
x=(4*x+3)%maxn;
cnt++;
for(int i=1; i<=100000; i++)
{
if(x%maxn==0)
{
temp=1;
break;
}
else
{
x=(8*x+7)%maxn;
cnt++;
}
}
}
if(temp==0)
{
x=m;
cnt=0;
x=(4*x+3)%maxn;
x=(4*x+3)%maxn;
cnt+=2;
for(int i=2; i<=100000; i++)
{
if(x%maxn==0)
{
temp=1;
break;
}
else
{
x=(8*x+7)%maxn;
cnt++;
}
}
}
if(temp==0)
printf("-1\n");
else
printf("%d\n", cnt);
}
return 0;
}
#include<stdio.h>
const int maxn=1000000007;
int main(void)
{
long long x, m;
int cnt;
int temp;
while(scanf("%lld", &m)!=EOF){
cnt=0; temp=0;
x=m;
for(int i=0; i<=100000; i++)
{
if(x%maxn==0)
{
temp=1;
break;
}
else
{
x=(8*x+7)%maxn;
cnt++;
}
}
if(temp==0)
{
x=m;
cnt=0;
x=(4*x+3)%maxn;
cnt++;
for(int i=1; i<=100000; i++)
{
if(x%maxn==0)
{
temp=1;
break;
}
else
{
x=(8*x+7)%maxn;
cnt++;
}
}
}
if(temp==0)
{
x=m;
cnt=0;
x=(4*x+3)%maxn;
x=(4*x+3)%maxn;
cnt+=2;
for(int i=2; i<=100000; i++)
{
if(x%maxn==0)
{
temp=1;
break;
}
else
{
x=(8*x+7)%maxn;
cnt++;
}
}
}
if(temp==0)
printf("-1\n");
else
printf("%d\n", cnt);
}
return 0;
}