题目大意
给出一个整数 ,你可以对 进行两种操作。
1
、
1、
1、将
x
x
x变成
4
x
+
3
4x+3
4x+3
2
、
2、
2、将
x
x
x变成
8
x
+
7
8x+7
8x+7
求最少通过多少次操作,使得
x
x
x是
1000000007
1000000007
1000000007的倍数?
题目解析
首先,可以很容易地发现,两个操作都是将数转化为二进制后,往后面加 2 2 2个或 3 3 3个 1 1 1
因此我们可以将操作都变为往后面加 1 1 1个 1 1 1,并不断取模。统计加 X X X个 1 1 1后,为 1000000007 1000000007 1000000007的倍数。
问题就转化为往后面加 X X X个 1 1 1的最少操作次数,一种是加 2 2 2个,一种是加 3 3 3个。处理出组合成 X X X这个数,最少用多少个2和3即可。
若 X = 1 X=1 X=1的情况,题目保证答案不超过 1 0 5 10^5 105,所以根本不会出现这种情况。
代码
#include<bits/stdc++.h>
#define LL long long
#define M 1000000007
using namespace std;
LL x;
int f[300005],t;
int main()
{
f[1]=f[2]=f[3]=1;
for(int i=4;i<=300000;i++) f[i]=f[i-3]+1;
cin>>x;
for(;x%M!=0;x=(x<<1)|1,x%=M,t++);
cout<<f[t];
return 0;
}