首页 > 其他分享 >[Codeforces Round #836 (Div. 2)C

[Codeforces Round #836 (Div. 2)C

时间:2022-12-21 16:55:08浏览次数:61  
标签:now 836 16 int 18 Codeforces ans Div include

C

这一次呢,题目要求让a[1]=x,a[n]=1,我们需要找到一个最小的序列使得每一个a[i]都可以被它的下标整除,没找到就是输出-1

我第一次是想着先让a[1]=x,a[n]=1,然后在中间一个一个的找它的下标的倍数,结果wa了

最后还是没有做出来!ε=(´ο`*)))唉

看来题解之后,才知道他们是这么做的(好想知道他们聪明的脑袋瓜子是怎么想出来的)

第一步是先判断n%x==0,如果不满足,那么就一定是输出-1

然后,找出所有n的因数(除了a[1]=x,a[n]=1,a[x]=n,其他的都让a[i]=i),

比如n=16,那么就有2,4,8,(不包括1和本身),x=2,那么我们可以把a[2]=4,a[4]=8,a[8]=16,a[16]=1(a[n]=1),一个这样的交换,这也是为什么我们要在前面判断n%x==0这一条件,这样的情况,刚好就是字典序最小的情况。

而且记得在交换的时候(swap(a[i],a[now],这个now是上一次的下标)也要记得判断是否满足a[i]%now等于0这一条件,因为我们也要保证交换了之后a[i]%i==0呀

比如n=36时,x=6,可以交换的就只有6,12,18,而不是2,3,4,6,9,12,18,如果是2,3,4,6,9,12,18,那么a[2]=3就这一个个就不符合条件了,所以还要判断上一次交换的下标和这一次的值是否可以整除

接下来就是看代码了

#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
int t,n,x,ans[maxn];
void solve()
{
    cin>>n>>x;
    ans[1]=x,ans[n]=1;
    for (int i=2;i<n;i++)
    {
        if (i==x) ans[i]=n;
        else ans[i]=i;
    }
    if (n%x)
    {
        cout<<-1<<'\n';
        return ;
    }
    if (n==x)
    {
        for (int i=1;i<=n;i++)
        {
            cout<<ans[i]<<" ";
        }
        cout<<'\n';
        return ;
    }
    int now=x;
    for (int i=x;i<n;i++)
    {
        if (n%i==0&&ans[i]%now==0)
        {
            swap(ans[i],ans[now]);
            now=i;
        }
    }
    for (int i=1;i<=n;i++)
    {
        cout<<ans[i]<<" ";
    }
    cout<<'\n';
    return ;
}
int main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

标签:now,836,16,int,18,Codeforces,ans,Div,include
From: https://www.cnblogs.com/righting/p/16996620.html

相关文章

  • 论文解读:Sequence to Sequence Mixture Model for Diverse Machine Translation
    论文解读:SequencetoSequenceMixtureModelforDiverseMachineTranslation  机器翻译是自然语言处理中比较热门的研究任务,在深度学习背景下,通过神经网络搭建的机器翻......
  • Your branch and ‘origin/master‘ have diverged
    开发中遇到拉取最新远程仓库代码的时候就出现下面错误,说我的本地和远程不一致。1Yourbranchand'origin/master'havediverged,2andhave1and4differentcommi......
  • [css] before和:after实现div下方的小三角
    <divclass="pop-box">aaa</div>.pop-box{position:absolute;width:250px;height:260px;background-color:#fff;border:1pxsolid#ccc;bord......
  • Codeforces Global Round 20--F1
    F1.ArrayShuffling结论交换的次数=点数-循环圈的数量所以只需要构造尽量多的循环圈,圈上的各个元素都是不相同的就可以了。代码#include<bits/stdc++.h>usingname......
  • Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT(持续更新)
    Preface有史以来打的最爆炸的一场,只写了AB一个原因是最近由于得了新冠导致疏于锻炼,脑子和手都有点不在状态另一个原因就是没去想C去开一眼感觉很naive的D(事实确实很naiv......
  • Codeforces Round #840 (Div. 2) C
    这一道题也是我没想到的题目大意是这样的:可以选择i,j(i<j),我们可以把i到j包括i,j的元素换成abs(a[i],a[j]),并且我们需要的答案就是经过一系列这样的操作,使得这个数组的......
  • Codeforces 1763 F Edge Queries 题解
    题目链接先观察满足题目中给出的限制的图有什么特点。先看\(C_u\),它指的是所有与\(u\)在同一个简单环内的节点。发现一个点v在\(C_u\)中,当且仅当\(u,v\)点双连通。关于点......
  • Codeforces Round #835 (Div. 4) ABCDEF(二分)
    https://codeforces.com/contest/1760【赛时A-E代码】A.MediumNumber题目大意:三个数字,求第二大的数字。input952614342021123111912108206......
  • Codeforces 1774
    A-AddPlusMinusSign简单题,直接\(\tt-\)和\(\tt+\)交替就好了。缺省源没有。intsolve(){ intn=getInt(); strings; cin>>s; boolb=(s[0]==1......
  • Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT AB
    (:我一开始以为我要爆0了,跌,磕磕绊绊,还好写出了这两题,后面的太难了题目都没看hhhttps://codeforces.com/contest/1763A.AbsoluteMaximization题目大意:给定一个数组a,我......