题目大意
给出一个整数 ,你可以对 进行两种操作。
1、1、1、将xxx变成4x+34x+34x+3
2、2、2、将xxx变成8x+78x+78x+7
求最少通过多少次操作,使得xxx是100000000710000000071000000007的倍数?
题目解析
首先,可以很容易地发现,两个操作都是将数转化为二进制后,往后面加222个或333个111
因此我们可以将操作都变为往后面加111个111,并不断取模。统计加XXX个111后,为100000000710000000071000000007的倍数。
问题就转化为往后面加XXX个111的最少操作次数,一种是加222个,一种是加333个。处理出组合成XXX这个数,最少用多少个2和3即可。
若X=1X=1X=1的情况,题目保证答案不超过10510^5105,所以根本不会出现这种情况。
代码
#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;
}