题意简述
个苹果排成一列。每天从左起第 个开始、每隔 个拿走 个(即拿走第 个),剩下的按原顺序重排。求拿完所有苹果的天数,以及编号 (最右)的苹果在第几天被拿走。
解题思路
某天剩 个苹果时,拿走的是位置 ,共 个,剩 个。每天约去掉三分之一,故 天就能拿完,直接模拟天数即可。
最右的苹果始终在末位,那天它的位置就是当前剩余个数 ,因此它被拿走当且仅当 。模拟中第一次遇到 的那天,就是它被拿走的日子。
用 避免浮点。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int day=0,ans=0;
while(n)
{
day++;
if(!ans&&n%3==1)ans=day;
n-=(n+2)/3;
}
cout<<day<<' '<<ans<<'\n';
return 0;
}