Number
jzoj(gz) 1781
题目大意:
现在给出一个x,可以把x变为4x+3或8x+7,问最少变多少次可以把x变为1000000007的倍数
输入输出样例
输入样例#1
125000000
输出样例#1
1
输入样例#2
281250001
输出样例#2
2
输入样例#3
18426114
输出样例#3
58
输入样例#4
705616876
输出样例#4
100000
数据范围:
对于50%的数据,答案不超过10
对于80%的数据,答案不超过1000
对于100%的数据,答案不超过100000
解题思路:
一开始我们看到4x+3和8x+7,我们可以发现4x和8x是两倍的关系,我们可以尝试拆开4x+3
可以得到:2(2x+1)+1,我们再拆8x+7,可以得到:2( 4x+3)+1也就是2(2(2x+1)+1)+1
看到这个,我们可以发现4x+3是两次2x+1,8x+7是三次2x+1,于是我们可以不停做2x+1,符合题意时,就判断2x+1的次数,我们竟可能选8x+7,因为他更优,若除3而余1就退一次8x+7选两次4x+3,若余2就选1次4x+3
代码:
#include<cstdio>
using namespace std;
long long n,ans;
int main()
{scanf("%lld",&n);while(n%1000000007ll){n=(n*2+1)%1000000007ll;//计算ans++;//记录}printf("%lld",ans%3?ans/3+1:ans/3);//按解题思路
}