mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
45 lines
1.3 KiB
C
45 lines
1.3 KiB
C
|
#include <stdio.h>
|
|||
|
//数据范围n<=10^18,m<=1000,时间几十ms
|
|||
|
#define __int64 long long
|
|||
|
__int64 N,M;
|
|||
|
int main()
|
|||
|
{
|
|||
|
scanf("%lld",&N);
|
|||
|
M=3;
|
|||
|
{
|
|||
|
__int64 f1 = 0;
|
|||
|
__int64 f2;
|
|||
|
__int64 X;
|
|||
|
if (M == 1)
|
|||
|
{
|
|||
|
printf("%lld\n",N);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for (__int64 i = 2; i <= N; ++ i)
|
|||
|
{
|
|||
|
if (f1 + M < i)//表示很有可能跳过X个i
|
|||
|
{
|
|||
|
X = (i - f1) / M;//能跳过多少个
|
|||
|
if (i + X < N)//如果没有跳过n,就是i<=N
|
|||
|
{
|
|||
|
i = i + X;//i直接到i+X
|
|||
|
f2 = (f1 + X*M);//由于f1+X*M肯定<=i,所以这里不用%i
|
|||
|
f1 = f2;
|
|||
|
}
|
|||
|
else//如果跳过了n,那么就不能直接加X了,而是只需要加(N-i)个M即可
|
|||
|
{
|
|||
|
f2 = f1+(N-i)*M;
|
|||
|
f1 = f2;
|
|||
|
i = N;
|
|||
|
}
|
|||
|
}
|
|||
|
f2 = (f1 + M) % i;//如果f1+M>=i或者跳过上面的一些i之后还是要继续当前i对于的出列的人
|
|||
|
f1 = f2;
|
|||
|
}
|
|||
|
}
|
|||
|
printf("%lld\n",f2+1);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|