C. Hilbert’s Hotel(数论&思维)
题目传送门
思路:因为要每个客人要安排到不同的房间,所以首先对
∀i,j,0<i<j<n,(toi=i+ai)=(toj=j+aj).
又因为:对于
j=kn+i,(k=1,2,3…)。
toj=kn×toi
所以还要保证对
∀i,j,0<i<j<n,
toimodn=tojmodn.
所以我们将所有
toi限定在范围
[0,n−1]的范围内,最后只需判断一下是否集合中有
n个数即可。注意负数要
+n后再取模.
AC代码:
#include<cstdio>
#include<set>
using namespace std;
int main(){
int n,t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
set<int>s;
for(int i=0,x;i<n;i++){
scanf("%d",&x);
s.insert(((x+i)%n+n)%n);
}
puts(s.size()==n?"YES":"NO");
}
return 0;
}