数字
【题目描述】
给出一个整数x,你可以对x进行两种操作。
1、将x变成4x+3
2、将x变成8x+7
问,最少通过多少次操作,使得x是1000000007的倍数?
【输入格式】
一行,一个整数x(1<=x<=1000000006)。
【输出格式】
一行,表示最少的操作步数。保证答案不超过10^5。
【样例输入1】
125000000
【样例输出1】
1
【样例输入2】
281250001
【样例输出2】
2
【样例输入3】
18426114
【样例输出3】
58
【样例输入4】
705616876
【样例输出4】
100000
【数据约定】
对于50%的数据,答案不超过10
对于80%的数据,答案不超过1000
对于100%的数据,答案不超过100000
【题目分析】
最近数学上学了数列,什么都不会的我只能靠找规律了,进行3次1的结果等于进行2的结果
4x+3=2(2x+1)+1,8x+7=2(2(2x+1)+1)+1
所以我们只要用2x+1计算出需要多少步就好了,因为2是递归三遍,1是递归两遍,我们要求最小的次数,所以先/3,然后%3看它用完2之后还剩多少再/2,两个结果加起来,但这样就有一个问题,如果是一共用了7次完成 那么7/3=2,7%3=1,1/2=0,ans=2+0=2,显然这个结果是错的,第一次做的时候没考虑到,然后就很开心的wa了,为了避免这个问题,我们就需要在cnt%3之后判断一下是否为2的倍数,如果cnt%3%2==0,ans=cnt/3+cnt%3/2,否则让cnt-3也就是少用一次2,把它加给1,ans=(cnt-3)/3+(cnt%3+3)/2=cnt/3+cnt%3/2+1
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const long long mod=1000000007; long long shi; int cnt=0; int main() { freopen("number.in","r",stdin); freopen("number.out","w",stdout); scanf("%lld",&shi); while(1) { shi=(shi*2+1)%mod; cnt++; if(shi==0) break; } int ans1,ans2,ans; ans1=cnt/3; if(cnt%3==0) ans=ans1; else { if(cnt%3%2==0) ans2=(cnt%3/2); else ans2=(cnt%3/2)+1; ans=ans1+ans2; } printf("%d ",ans); fclose(stdin);fclose(stdout); return 0; }