ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) C. Permutation Cycle

C. Permutation Cycle

For a permutation P[1... N] of integers from 1 to N, function f is defined as follows:

Let g(i) be the minimum positive integer j such that f(i, j) = i. We can show such j always exists.

For given N, A, B, find a permutation P of integers from 1 to N such that for 1 ≤ i ≤ Ng(i) equals either A or B.

Input

The only line contains three integers N, A, B (1 ≤ N ≤ 106, 1 ≤ A, B ≤ N).

Output

If no such permutation exists, output -1. Otherwise, output a permutation of integers from 1 to N.

Examples
input
Copy
9 2 5
output
6 5 8 3 4 1 9 2 7
input
Copy
3 2 1
output
1 2 3 

题意:已知P是一个排列,P[i]是得到第i位置的数字,例如:n=3,那么P={1,3,2},P[2]=3,P[3]=2。

接着给你一个函数f:代入一个i,j,当j>1时,将i所对应的位置的值P[i]代入,同时j-1,直到j==1,返回p[i]的值。

例如:一个排列P={2,3,4,5,1},f(2,4)=f(3,3)=f(4,2)=f(5,1)=5。

接着定义一个函数g:对于每一个i,g(i)的值是f(i,j)=i的最小一个j。现在给你n,a,b,让你构造一个排列P,对于每一个i,使g(i)==a或b。


思路:我们一点一点来,首先函数f很简单,其实就是一个位置转移的过程,当j==1时返回当前位置的里的值。我们重点看函数g,也就是看f(i,j)=i,这个表达式的意义我们自己找找规律其实就很好理解了。

我们可以这样想:函数f的转移,其实是图中节点的转移,当前节点是i,那么下一个呢?就是P[i],接下来呢?重复刚刚的操作即可,这样就很好理解了吧。

我们接着来看函数g:f(i,j)=i,我把函数f的意义和图的节点遍历联系起来,那么这个角度看待当前的函数g是不是就很简单了:就是以i为起点,经过不断的转移又回到i,那么转移次数就是j的大小啊,所以j最小,就是让我们构造一个环,j就是这个环的最小正周期。

现在函数g的意义已经明确了,那么推构造的规律:1的环1->1   ,2的环2->1  3的环2->3->1  4的环2->3->4->1,构造方式很明显了,将1-n的升序排列整体向左平移一次,第一个位置放到最后位置去即可。注意,环不一定有一个,比如样例1,这里不再推了,自己看样例应该已经可以理解了,由于我们的排列元素不能重复,所以会产生无解的情况,此时就是环的个数无法正确的得到。

关于环的个数,利用扩展欧几里得即可解出ax+by=n这个不定方程的一组非负整数解,就可以构造了,x,y所对应的值即周期为a的环x个,周期为b的环y个,且利用的元素不能重复,只能解释成这样了,剩下看代码吧,代码真的不长。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,a,b,tmp,x,y,flag;
int main()
{
    while(~scanf("%lld%lld%lld",&n,&a,&b))
    {
        flag=0;
        for(ll i=0;i<=1000000;i++)       //暴力枚举x,y求不定方程的非负整数解,扩展欧几里得当然也行
        {
            tmp=n-i*a;
            if(tmp<0)break;
            else if(tmp%b==0)
            {
                flag=1;
                x=i;y=tmp/b;
                break;
            }
        }
        if(flag==0){printf("-1\n");continue;}   //没有非负整数解
        tmp=1;
        for(ll i=1;i<=x;i++)       //构造x
        {
            for(ll j=tmp+1;j<tmp+a;j++)printf("%lld ",j);
            printf("%lld ",tmp);
            tmp+=a;
        }
        for(ll i=1;i<=y;i++)   //构造y
        {
            for(ll j=tmp+1;j<tmp+b;j++)printf("%lld ",j);
            printf("%lld ",tmp);
            tmp+=b;
        }
        printf("\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: emd-icm42670-p_examples-2.1.2.pdf.rar 是一个压缩文件,其中包含了 ICM-42670-P 芯片的示例代码及文档。ICM-42670-P 是一款低功耗、高性能的惯性测量单元(IMU)传感器,可以用于测量物体的加速度、角速度和方向等参数。这个压缩文件包含了 ICM-42670-P 传感器的使用说明、接口定义、寄存器设置及示例代码。 ICM-42670-P 示例代码可以帮助开发者快速理解和使用该芯片。示例代码中提供了一些常见的功能示例,如初始化传感器、获取传感器数据、配置传感器的采样率和滤波器等。开发者可以根据自己的需求进行修改和扩展,以满足特定的应用场景。 除了示例代码,压缩文件中还包含了 ICM-42670-P 芯片的详细技术文档,比如数据手册和寄存器映射表。这些文档可以帮助开发者深入了解芯片的功能、性能和使用方法。通过阅读这些文档,开发者可以更好地理解芯片的工作原理,优化代码的实现,并解决可能出现的问题。 总之,emd-icm42670-p_examples-2.1.2.pdf.rar 包含了 ICM-42670-P 芯片的示例代码和技术文档,为开发者提供了使用该芯片的相关信息和参考实现。开发者可以通过阅读文档和使用示例代码,快速上手并应用该芯片于各种应用场景中。 ### 回答2: emd-icm42670-p_examples-2.1.2.pdf.rar是一个压缩文件,其中包含了ICM42670传感器的示例代码。ICM42670是一款高性能的惯性测量单元(IMU),可用于测量和监测物体的加速度和角速度。 该压缩文件中的示例代码可以帮助开发人员更好地理解和使用ICM42670传感器。代码中包含了各种功能的示例,比如初始化传感器、读取加速度和角速度数据、设置传感器的工作模式等。 这些示例代码使用了特定的编程语言和开发环境,通常会包含详细的说明和注释,以便开发人员能够轻松地理解和修改代码。同时,开发人员还可以根据自己的需求,将这些示例代码作为基础,进行进一步的开发和定制。 通过使用ICM42670传感器示例代码,开发人员可以快速构建和开发基于该传感器的应用程序,如运动跟踪、姿态检测、导航系统等。此外,示例中的代码还可以用于教育和学习目的,帮助初学者更好地理解和掌握传感器的工作原理和使用方法。 总之,emd-icm42670-p_examples-2.1.2.pdf.rar提供了ICM42670传感器的示例代码,为开发人员提供了一个方便的资源,帮助他们更好地利用和应用这个高性能的惯性测量单元。 ### 回答3: emd-icm42670-p_examples-2.1.2.pdf.rar 是一个压缩文件,主要用于存储和传输PDF格式的示例文件。该文件名包含以下信息: emd-:表示此文件与电子机械制动系统( Electronic Mechanical Braking System)相关。这可能是一个示例文件,用于展示电子机械制动系统的使用方法或演示其功能。 icm42670-:表示此文件与ICM42670有关。ICM42670是一种集成了三轴陀螺仪和三轴加速度计功能的传感器芯片。该文件可能包含有关如何使用ICM42670芯片的示例代码或应用程序。 p_examples-:表示此文件是一个示例文件集合(Examples)。这些示例文件可能包含不同的代码示例,演示了如何在特定平台上使用ICM42670芯片。 2.1.2:表示此文件的版本号为2.1.2。这可能意味着这是某个软件或平台的特定版本,其中包含了特定版本ICM42670芯片的示例文件。 .pdf:表示该文件是一个PDF格式的文件,这是一种广泛使用的文件格式,可用于显示文本和图像的电子文档。 .rar:表示该文件是一种压缩文件,采用了RAR格式进行压缩。RAR是一种常见的压缩文件格式,可用于减小文件的大小,便于存储和传输。 因此,emd-icm42670-p_examples-2.1.2.pdf.rar 可能是一个包含了ICM42670芯片使用示例的PDF文件集合,并使用RAR格式进行了压缩。要查看其中的内容,需要使用支持RAR格式的解压缩工具将其解压缩,并使用PDF阅读器打开PDF文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值