0
点赞
收藏
分享

微信扫一扫

C. Permutation Cycle 置换,构造环

Spinach菠菜 2022-01-15 阅读 54
算法

在这里插入图片描述
不难发现,这是个 i->pi的置换
对于样例1,即为置换(6 1)(5 4 3 8 2)(9 7)
题目即让构造ax + b y = n
x个a次置换,y个b次置换


ll exgcd(ll a, ll b, ll &x, ll &y){

    if(!b){
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a%b, y, x);
    y -= x*(a/b);
    return d; 
}


signed main(){

    ll n, a, b;
    cin >> n >> a >> b;
    ll g = gcd(a, b);
    if( n % g==0 ){
        ll x, y;
        exgcd(a, b, x, y);
        // 最小化处理
        ll mod = b / g;
        x *= (n / g);
        x = ((x % mod) + mod) % mod;
        y = (n - a * x) / b;
        if(x<0||y<0){
            puts("-1");
        }else{
            int cnt = 1;
            int last = cnt;
            For(i,1,x){
                For(j,1,a-1){
                    printf("%d ",++cnt);
                }
                printf("%d ",last);
                cnt++;
                last = cnt;
            }
            For(i,1,y){
                For(j,1,b-1){
                    printf("%d ",++cnt);
                }
                printf("%d ",last);
                cnt++;
                last = cnt;
            }
        }
    }else{
        puts("-1");
    }
        
}
举报

相关推荐

0 条评论