對於這些題的做法,我們先把無窮的空間映射爲一個可數的集合。我們可以知道的是,對於處於第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");
}
}
}