• 【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
    ");
            else printf("YES
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    前端-----盒子模型
    跨域
    DRF的分页
    DRF的权限和频率
    DRF 版本和认证
    DRF的视图和路由
    APIView和View的区别
    Serializers序列化组件
    RESTful
    Vuex以及axios
  • 原文地址:https://www.cnblogs.com/valk3/p/12939526.html
Copyright © 2020-2023  润新知