数字

数字

【题目描述】

    给出一个整数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\n",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}

 

posted @ 2016-10-21 06:46  [lemon]  阅读(413)  评论(0编辑  收藏  举报
……