【CF-1345】C.Hilbert's Hotel 数论

C. Hilbert's Hotel

题意

给出一个长度为n,下标从0开始的数组\(a\),现在对于所有的整数做一个操作,数字\(i->i+a[i \% n]\),问是否有多个数字变成了同一个数字?

题解

对数字进行分组:

[0,n,2n,3n,4n.....]

[1,n+1,2n+1,3n+1,4n+1...]

[2,n+2,2n+2......]

.....

[n-1,2n-1,3n-1]

每组中的数字操作之后,组里的值相差n的倍数。

如果存在两个组的值%n相同,那么这两个组中一定会有数字重复。

如果任意两个组的值%n不相同,那么所有的组一定不会重复

代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const double eps=1e-6;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const int N = 2e5+10;

int arr[N];
map<int,int>mp;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        mp.clear();
        int n;
        scanf("%d",&n);
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&arr[i]);
            arr[i]+=i;
            arr[i]=(arr[i]%n+n)%n;
            if(mp[arr[i]]) flag=1;
            mp[arr[i]]=1;
        }
        if(flag) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}
posted @ 2020-05-22 20:22  Valk3  阅读(112)  评论(0编辑  收藏  举报