1 条题解

  • 0
    @ 2026-9-16 15:50:09

    SOLUTION

    由于当时我是突然灵机一动想出来的,我可能不会讲想到的过程。

    我们从反方向倒推,从只有一只猴子的局面推出原始的局面。 当前还剩下 i[1,N]i \in [1,N] 只猴子时,我们不妨将其编号为 [1,i][1,i]。 记 fif_i 为当前剩 ii 只猴子时,最后留下来的一个,显然有 f1=1f_1 = 1

    假设枚举到 ii 只猴子的局面时,对任意 j<ij<ifjf_j 已知。

    我们知道这一轮要报 N+1iN+1-i 个数,具体地,这时编号为 (N+1i)modi+1(N+1-i) \mod i+1 的猴子会出局,记这个编号为 deldel。 接下来这个局面会转化为 i1i-1 只猴子,从 delmodi+1del \mod i +1 开始报数的局面。

    不难发现此时 fi=(del+fi11)modi+1f_i = (del + f_{i-1} - 1) \mod i +1

    根据数学归纳法,可以求出 fnf_n

    按这个模拟即可。

    CODE

    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    int T,n,m;
    signed main(){
        ios::sync_with_stdio(0);
        cin.tie(0),cout.tie(0);
        cin>>T;
        while(T--){
            cin>>n;
            int lst=1,del=0;
            for(register int i=2;i<=n;i++){
                del=(n-i)%i+1;
                lst=(del+lst-1)%i+1;
            }
            cout<<lst<<'\n';
        }
        return 0;
    }
    

    信息

    ID
    61
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    (无)
    递交数
    70
    已通过
    22
    上传者