对于这些题的做法,我们先把无穷的空间映射为一个可数的集合。我们可以知道的是,对于处于第i个位置的客人(i为任意整数),i+ki(k也为任意整数)的客人也会映射到同一个空间,手动模拟一下就可以发现了。为了方便处理,只要把他们映射到0~n-1的位置就可以了。由于每个房间只有一个人,所以一旦出现一间房两个人,必定会满足大于一人和空房的条件。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<stack>
#include<utility>
#define int long long
using namespace std;
int t,n,a[200005],mp[200005];
signed main()
{
cin>>t;
while(t--)
{
bool flag=false;
scanf("%lld",&n);
memset(mp,0,sizeof(mp));
for(int i=0;i<=n-1;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1-1;i<=n-1;i++)
{
int x=(i+a[i])%n;
x=(x+n)%n;
mp[x]++;
if(mp[x]>=2)
{
flag=true;break;
}
}
if(flag)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
}