首页 > 其他分享 >Codeforces Round #838 (Div. 2) D. GCD Queries

Codeforces Round #838 (Div. 2) D. GCD Queries

时间:2022-12-16 11:45:02浏览次数:46  
标签:gcd int 838 cout Codeforces long 询问 GCD

题意

有个长度为n的排列p,[0,1,2,...n-1],你可以进行至多2*n次询问,每次询问两个i,j,返回gcd(pi,pj),让你在规定时间内猜出0在哪两个位置之一

思路

这是一道交互题,询问的上限是2n次
通过三个数,可以去除掉一个不是0的数
对三个数进行以下询问,gcd(a,i),gcd(b,i)
如果gcd(a,i) != gcd(b,i),那么其中a,b小的被i取代,因为a,b中假如有0,那么一定是大的数,那么小的数一定不是0
如果gcd(a,i) == gcd(b,i),那么跳过i,因为假如i是0,因为数列每个数都不同,所必不可能相等
那么for一遍数组,每次和当前位置i进行两次询问,最多2
n的限制内就可以筛选出0可能存在的位置p,q

代码

#include <bits/stdc++.h>

typedef long long ll;
using namespace std;
const int N = 2e4 + 10;
int n, t = 1;
long long a[N], b[N];
int pw[N];
int l[N], cnt[N];
const int mod = 998244353;
map<int, int> mp;
int v[N];

int ask(int x, int y) {
    cout << "? " << x << ' ' << y << endl;
    int u;
    cin >> u;
    return u;
}

void ok(int x, int y) {
    cout << "! " << x << ' ' << y << endl;
    int u;
    cin >> u;
}

void run() {
    cin >> n;
    int p = 1, q = 2;
    for (int i = 3; i <= n; i++) {
        int r1 = ask(p, i), r2 = ask(q, i);
        if (r1 < r2) {
            p = i;
        }
        if (r1 > r2) {
            q = i;
        }

    }
    ok(q, p);

}

int main() {
    srand(time(0));
    cin >> t;
    while (t--)
        run();
    return 0;
}


标签:gcd,int,838,cout,Codeforces,long,询问,GCD
From: https://www.cnblogs.com/4VDP/p/16986935.html

相关文章

  • Educational Codeforces Round 139 (Rated for Div. 2)
    EducationalCodeforcesRound139(RatedforDiv.2)数组开小,身败名裂场。CF1766AExtremelyRound直接前缀和递推预处理一下每个\(n\)的答案,询问直接输出即可。CF......
  • 一个新ACMer的刷题记录捏(Round.694) codeforces ABC
    A.StrangePartitionProblem-A-Codeforces  2022-12-1514:00:52​#include<bits/stdc++.h>#defineintlonglongconstintN=100010;usingnamespac......
  • Educational Codeforces Round 136 (Rated for Div. 2)
    题目链接A核心思路:其实就是一个签到题没什么好说的,我们可以直接通过观察样例大胆猜测结论:也就是只有是一列的时候是完全孤立的。直接看代码吧.#include<bits/stdc++.h>......
  • RTL8380M/82M管理型交换机系统软件操作指南四:QoS/服务质量
    接下来对QoS进行详细的描述,主要包括以下七大内容:QoS概述、功能简介、拥塞管理、策略分类、调度方式、优先级映射配置、QoS端口配置.1.1QoS概述QoS(QualityofService,服务......
  • Codeforces Round 793 div2 (A-D)
    A题,题意是给一个回文串,问有多少个字符删掉,还是一个回文串这个题看样例,肯定是从中间开始查相同字符的段长度,没啥难度代码:#include<bits/stdc++.h>usingnamespacest......
  • 最大公约数 GCD greatest common divisor
     辗转相除法#include<stdio.h>intmain(void){intm,n,r;scanf("%d%d",&m,&n);if(m<n){m=m^n;n=m^n;......
  • Codeforces Round #837 (Div. 2) A-C
    A.HossamandCombinatorics题意:给定一个长度为n的序列,求两个不同位置的数的差值等于所有数差值的最大值的数对数量。分析:显然排序后取最大最小就是差的绝对值最大,再......
  • Educational Codeforces Round 139 (Rated for Div. 2)
    题目链接A核心思路:这个其实就是一个简单的dp状态定义:dp[i]表示的是\(1\simi\)中的完美数的个数状态划分:这个还是比较显然的,我们只需要根据最后一个位置进行状态划分......
  • Codeforces Round #655 (Div. 2) ABCDEF题解
    题号博客链接cf分数算法标签A​​https://blog.nuoyanli.com/2020/07/14/codeforces-round-655-div-2-a/​​800简单B​​https://blog.nuoyanli.com/2020/07/14/codeforces......
  • Educational Codeforces Round 139 (Rated for Div
    A.ExtremelyRound当n为3位数时,例如\(n=120\),满足题目要求的情况有123456789102030405060708090100以上19种情况,一位和二位去满各有九种情况,三位只......