背单词
题目描述
小明正在为四级做准备,他计划至少背 n 个新单词。
为了完成这个目标,小明决定在每天结束前背一些新单词,具体来说:
- 第 1 天结束前,小明会背 m 个新单词;
- 第 i 天( i ≥ 2 i\ge 2 i≥2 )结束前,小明会根据第 i−1 天背的单词数
- 计算第 i 天背多少个新单词?
- 假设小明在第 i−1 天背了 t 个新单词:
如果 t 是奇数,小明将会在第 ii 天结束前背
3
×
t
+
1
3\times t+1
3×t+1 个新单词;
如果 t 是偶数,小明将会在第 ii 天结束前背
t
2
\dfrac{t}{2}
2t个新单词。
现在小明想知道按照这个方式背单词,最早在第几天结束时累计背了至少 n 个新单词。
输入描述
输入一行,包含两个整数 n,m ,分别代表小明计划背的新单词总数和小明第一天背的新单词数量。
输出描述
输出一行,包含一个整数 d ,代表小明在第 d 天结束时累计背了至少 n 个新单词。
输入示例1
100 50
输出示例1
3
备注:
【样例解释】
第一天背了 50 个新单词,第二天背了 25 个新单词,第三天背了 76 个新单词,累计背了 151 个新单词,最早在第三天结束时完成了背至少 100 个新单词的计划。
【评测用例规模与约定】
对于 70% 的评测用例, 1 ≤ n ≤ 1 0 6 , 1 ≤ m ≤ 1000 1\le n\le 10^6,1\le m\le 1000 1≤n≤106,1≤m≤1000 。
对于100% 的评测用例, 1 ≤ n ≤ 1 0 12 , 1 ≤ m ≤ 1000 1\le n\le 10^{12},1\le m\le 1000 1≤n≤1012,1≤m≤1000 。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <sstream>//整型转字符串
// #include <stack>//栈
// #include <deque>//堆/优先队列
// #include <queue>//队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,m;
cin>>n>>m;
ll ans=0;
while(n>0)
{
n-=m;
if(m&1)
{
m=3*m+1;
ans++;
}
else
{
//m>>=1;
m/=2;
ans++;
}
if(m==4)
{
ans+=(n/7)*3;
n%=7;
}
}
cout<<ans<<endl;
return 0;
}