首页 > 其他分享 >牛客多校 A 题题解

牛客多校 A 题题解

时间:2024-08-08 20:39:20浏览次数:5  
标签:textstyle gcd 牛客 cdot 题解 多校 leq int 公因数

牛客多校 8 - A

Haitang and Game

Given a set \(\textstyle S\), dXqwq and Haitang take turns performing the following operations, with dXqwq going first:

  • Find a pair \(\textstyle (x,y)\) such that \(\textstyle x,y\in S\) and \(\textstyle \gcd(x,y)\notin S\).

  • Insert \(\textstyle \gcd(x,y)\) into \(\textstyle S\).

The player who cannot make a move loses the game. You need to output the winner when both players play optimally.

Each test contains multiple test cases. The first line contains an integer \(\textstyle T\) (\(\textstyle 1\leq T\leq 20\)) — the number of test cases. The description of the test cases follows.

The first line of each test case contains a single integer \(\textstyle n\) (\(\textstyle 1\leq n\leq 10^5\)) — the size of set \(\textstyle S\).

The second line contains \(\textstyle n\) integers \(\textstyle a_1,a_2,\cdots,a_n\) (\(\textstyle 1\leq a_1<a_2<\cdots<a_n\leq 10^5\)) — the elements of set \(\textstyle S\).

解题思路:

考场上这题没优化好导致 \(95.46\) 的样例通过,而最后 \(4.54\) 的样例被卡了,我真的服了

  • 简单分析之后可以发现,无论两边最后怎么选,最后的形成的数列的个数是固定的,如果最后形成的数列的个数比原本的数列的个数增加奇数个,那么 \(dXqwq\) 胜利, 否则 \(Haitang\) 胜利.
  • 而要怎么找出所有的可能插入的 \(gcd\) 呢? 首先,观察到数据范围在 $ 1\leq a \leq 10^5$ 的范围,我们可以开一个 \(bool\)类型的哈希表来记录在初始的集合中出现过的元素,然后我们枚举可能还可以在插入的数据 \(i\) (\(1\leq i \leq 5 \times 10^4\) ) ,在枚举过程中,如果已经在集合中就直接跳过,如果不在集合中,就需要开始判断,判断的过程中,遍历 在 $1 \leq x \leq 1 \times 10^5 $ 中 \(i\) 的倍数,这里注意,我考场上把每两个 \(i\) 的倍数都进行了 \(gcd\)运算, 这样直接导致我考场上这一题 \(TLE\) 了几十发...... 实际上, 如果存在 \(k_1\cdot i\) 与 $ k_2 \cdot i$ 的最大公倍数为 \(i\) ,就可以得出 \(gcd(k_1,k_2)=1\) , \(k_1\) 和 \(k_2\) 互质,\(gcd (k_1,k_2 ,......k_{n-1} ,k_{n})=1\) ,那么 . 下证必要性, 若存在 $gcd (k_1 \cdot i,k_2 \cdot i,......k_{n-1} \cdot i,k_{n} \cdot i) = i $ ,即 \(gcd (k_1,k_2 ,......k_{n-1} ,k_{n})=1\) ,我们如何证明存在 \(gcd(k_i,k_j)=1\) 呢? 该出采用反证法,如果 任意 \(k_i\) 与 \(k_j\) 都凉凉不互质,则 存在 公因数 \(t\) ($ t != 1$)可以被提出来最后必然存在 \(gcd(k_1,k_2,k_3,......k_{n-1},k_n) \neq 1\) ,与结论相悖 ,故可以得出, 若所有的\(i\) 的倍数的元素的公因数是 \(i\) ,那么必然存在最少一对 \(i\) 的倍数的元素的公因数是 \(i\) ,若在 \(i\) 的倍数的元素中存在两个数的公因数是 \(i\) ,那么必然存在所有的 \(i\)的倍数的元素的公因数 \(\leq i\) ,也就是为 \(i\) ,所以综上只需要求一下所有的 \(i\) 的倍数的元素的最大公因数并判断是否为 \(i\) 即可得出是否存在两个元素的\(gcd(a_i,a_j)\)是否为 $ i $.
  • 总结: 对基本的数论知识不熟。

AC code:

#include <bits/stdc++.h>
#define print(x)    cout<<#x<<'='<<x<<'\n'
using namespace std;
const int maxn = 1e5 + 9;
int a[maxn];
int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while (!isdigit(c))
    {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
int n;
int gcd(int x, int y)
{
    return y == 0 ? x : gcd(y, x % y);
}
int ct=0;
void solve()
{
    auto Y = [&]()
    {
        cout << "dXqwq" << "\n";
    };
    auto N = [&]()
    {
        cout << "Haitang" << '\n';
    };
    cin >> n;
    vector<bool> mm(1e5 + 9, 0);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        mm[a[i]] = 1;
    }
    int count = 0;
    for (int _ = 50000; _ >= 1; _--)
    {
        // print(_);   
        if (!mm[_])
        {
            int t=0;
            for (int i = 2*_; i <= 100000; i+=_)
            {
                if (mm[i])
                {   
                    t=__gcd(t,i);
                }
            }
            if(t==_)
            {
                mm[_]=1;
                count++;
            }
        }
    }
    if(count&1)
    {
        Y();
    }
    else N();
    // print(++ct);
}
int main()
{
    std::ios::sync_with_stdio(0);
    std::cin.tie(0),cout.tie(0);
//     freopen("1data.in","r",stdin);
    int t;
//     int st = clock();
    cin >> t;
    while (t--)
        solve();
//     int ed = clock();
//     cerr << ed - st;
    return 0;
}

标签:textstyle,gcd,牛客,cdot,题解,多校,leq,int,公因数
From: https://www.cnblogs.com/cxjy0322/p/18349698

相关文章

  • ρars/ey 题解
    给个链接:ρars/ey。我们考虑一个树上背包。设\(f_{u,i}\)表示在\(u\)号节点的子树内删除\(i\)个点的最小代价。显然有答案为\(f_{1,siz_1-1}\)。接下来我们考虑转移。看这一张图:这里红圈内的东西为当前的\(siz_u\),绿圈部分为\(siz_j\)。我们枚举\(x\)为\(u\)子......
  • CF1514D Cut and Stick 题解
    不知道会不会更不好的阅读体验题目的关键步骤为求出区间绝对众数(频率高于\(\left\lceil\frac{len}{2}\right\rceil\))的出现次数,本文仅仅对这一问题进行探讨,剩余的解题步骤不难理解,可以参考其他题解。解法1考虑一个随机化的解法,从区间中随\(40\)个数,假定其为区间绝对众......
  • 2024-08-07 多校联合暑假训练赛第四场 补题+分析
    A.小盒子题意+思路:题意其实概括的不是非常准确简要题意:圆盒有n个格子,格子自带ai个棋子.是否通过任意起点通过顺时针-1,-2,...,-n的操作使得圆盒中所有所有的棋子都为0思路:贪心对于所有棋子通过顺时针操作的时候每一次都是(1+n)*n/2次是一个等差公式所以......
  • 电话号码转换 - 华为机试真题题解(Java)
    考试平台:时习知分值:200分(第二题)考试时间:两小时(共2题)题目描述将电话号码转换,需要实现如下的中英文电话号码转换:输入的字符串中每个数字对应为中文数字中的英文单词,如Double表示两个数字相同。将输入的中文数字字符串转换为英文单词的电话号码。若输入不合法,则输出......
  • 图片表格内容识别转换-II - 华为机试真题题解(Java)
    考试平台:时习知分值:200分考试时间:两小时(共2题)题目描述华为云推出了“通用表格识别”服务,可以将图片表格转换成文本数据。请你将文本数据进一步转换为“文本型表格”,如下图所示:输入现给出一个图片表格的文本数据:每行数据形如line3col1A,表示第3行第1列的单......
  • 20240808题解
    话说T2写了个动态树结果考场调不出来,这下大炮打蚊子了。森林(forest)题面:符合条件的森林中深度相同的点度数相同,\(1\lei\len\),求点数为\(i\)的符合条件的森林的种类数。题解:将森林中每一个根节点连到同一个节点上变成一棵树。令\(f(i)\)表示符合条件的树的种类数,那么\(f(i......
  • SSY20240805提高组T2题解
    题干描述题目描述给定一个长度为......
  • Crash 的旅行计划 / 蓝色彼岸花 题解
    前言题目链接:Hydro&bzoj。题意简述一棵\(n\)个结点的树上,每个点有点权,有\(m\)次操作:修改\(u\)的点权;查询以\(u\)为一端的简单路径的点权和最大值。对于\(20\%\)的数据:\(n,m\leq10^3\);对于另\(30\%\)的数据:第\(i\)条边连接\(i\)和\(i+1\);对于......
  • 洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解
    暴搜!!暴搜!!暴搜!!重要的事情说三遍#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,ans,use[N];strings,word[N];voiddfs(strings){intls=s.size();//s的lengthans=max(ans,ls);//求出最长的单词接龙for(inti=0;i<n......
  • 洛谷P2404 自然数的拆分问题——题解
    洛谷P2404题解传送锚点摸鱼环节自然数的拆分问题题目描述任何一个大于\(1\)的自然数\(n\),总可以拆分成若干个小于\(n\)的自然数之和。现在给你一个自然数\(n\),要求你求出\(n\)的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列......