题解:P14171 【MX-X23-T1】丢手绢

· · 题解

最近和圈有关的问题好多。

因为 a_i 很大,所以不可能挨个枚举。因为圈的特殊性质,将 a_in 取个模就得出在 n 范围内的变化情况。注意,取完模后还要判断范围问题,要不然会 RE。

AC Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,a[maxn]; 
int main(){
    memset(a,0,sizeof(a));
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        int k,u,l;
        scanf("%d",&k);
        if(k==0) a[i]++;
        else if(k>0){
            u=k%n;
            l=i+u;
            if(l>n) l=l-n;
            a[l]++;
        }else{
            u=(k%n);
            l=i+u;
            if(l<1) l=n+l;
            a[l]++;
        }
    }
    int maxp=0;
    for(int i=1;i<=n;++i) maxp=max(maxp,a[i]);
    for(int i=1;i<=n;++i){
        if(a[i]==maxp) cout<<i<<" ";
    }
    return 0;
}

另:我认为题意中逆时针-a_i 个容易误导,可能是顺时针a_i 个。