• C. Almost All Multiples(贪心 + 思维)


    Problem - C - Codeforces

    给定两个整数n和x,如果pi是i的倍数,所有1≤i≤n-1,pn=1,且p1=x,则长度为n的排列组合† p被称为搞笑。

    找出最小的有趣的排列组合,或报告说不存在这样的排列组合。

    † 长度为n的排列组合是一个由1到n的每个整数精确地组成的数组。

    ‡ 让a和b是长度为n的排列组合。如果在a和b不同的第一个位置i,ai<bi,则a在词典上小于b。如果一个排列组合比其他所有的排列组合都小,那么这个排列组合就是词典上最小的排列组合。

    输入
    输入由多个测试案例组成。第一行包含一个整数t(1≤t≤104)--测试案例的数量。测试用例的描述如下。

    每个测试用例的唯一一行包含两个整数n和x(2≤n≤2⋅105;1

    所有测试用例的n之和不超过2⋅105。

    输出
    对于每个测试用例,如果答案存在,则输出n个不同的整数p1,p2,...,pn(1≤pi≤n) - 词汇学上最小的有趣的排列组合p,否则,输出-1。

    例子
    输入复制
    3
    3 3
    4 2
    5 4
    输出拷贝
    3 2 1 
    2 4 3 1 
    -1
    注意
    在第一个测试案例中,排列组合[3,2,1]满足所有条件:p1=3, p3=1, 并且。

    p1=3是1的倍数。
    p2=2是2的倍数。
    在第二个测试案例中,排列组合[2,4,3,1]满足所有条件:p1=2,p4=1,并且。

    P1=2是1的倍数。
    p2=4是2的倍数。
    p3=3是3的倍数。
    我们可以证明,这些排列组合是lexicographically最小的。

    在第三个测试案例中不存在这样的排列组合。

    题解:
    我们目前知道

    a[1] = x

    a[n] = 1

    如果n不能放在x的位置上,则一定不存在这样的数组

    如果存在

    a[x] = n

    但是可能会出现,

    t = x(代表目前a[t] = n)

    if(n%(x*i) == 0&&x*i%t == 0)

    swap(a[x*i],a[t])

    t = x*i

    那么我们就可以把小的数往前提,大的数往后放,模拟这个过程即可

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. #define int long long
    10. //1 1 3 3 3
    11. int n,k,m;
    12. int a[200040];
    13. void solve()
    14. {
    15. int n,x;
    16. cin >> n >> x;
    17. if(n%x)
    18. {
    19. cout<<"-1\n";
    20. }
    21. else
    22. {
    23. for(int i =2 ;i < n;i++)
    24. a[i] = i;
    25. a[x] = n;
    26. a[1] = x;
    27. a[n] = 1;
    28. int t = x;
    29. for(int i = 1;i*x < n;i++)
    30. {
    31. if(n%(i*x) == 0&& (x*i)%t == 0)
    32. {
    33. swap(a[i*x],a[t]);
    34. t = i*x;
    35. }
    36. }
    37. for(int i = 1;i <= n;i++)
    38. cout<<a[i]<<" ";
    39. cout<<"\n";
    40. }
    41. }
    42. signed main()
    43. {
    44. int t = 1;
    45. cin >> t;
    46. while(t--)
    47. {
    48. solve();
    49. }
    50. }
    51. //4 8 12 16 20 24
    52. //
    53. //1 2 3 2
    54. //1 2 2 2 2 3
    55. //

     

  • 相关阅读:
    RK3568-UART通信
    PMO大会的主办方是PMO评论
    智能毫米波雷达人体感应器,实时检测静止存在,智能化控制方案
    一个Windows远程工具,小巧但实用,支持RDP、SSH、SFTP、FTP等多种协议
    Spring MVC总结2 - @ControllerAdvice详解
    展开说说:Android Fragment完全解析-卷二
    倍增法求最近公共祖先(LCA)
    使用Visual Studio Code 进行Python编程(一)
    【闲聊杂谈】ElasticSearch的深度分页相关
    PyTorch and Stable Diffusion on FreeBSD
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/128050903