双六(挑战程序设计竞赛)

该博客介绍了如何运用拓展欧几里得算法解决一个基于骰子游戏的问题。游戏规则是在一个双六格子上,通过掷出带有a、b、-a、-b值的骰子,从0号格子走到1号格子。当a和b的最大公约数不为1时,问题无解;否则,通过拓展欧几里得算法求解方案。博客给出了详细的算法实现和不同情况下的输出结果,并提供了拓展欧几里得算法的链接供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双六,可以理解为是 x 轴上无限延展的若干个格子,例如

...   -3  -2   -1   0   1   2   3   ...

其中 00 号格子是起点, 11 号格子是终点。

有一个神奇的骰子,上面只有 a,b,−a,−b 四个整数。

每当掷出一个值,是正值则向右移动相应距离的格子,若是负值则向左移动相应的格子。

问是否存在一种投掷的方案,能从 0 号格子走到 1 号格子。

如果能,输出任意一种方案即可。若不能,则输出 −1。

投掷方案由 4 个整数组成,表示 a,b,−a,−b 出现了多少次。

提示

  • 本题采用 special judge,输出任意一种合法的方案均可
  • 由于没有固定答案,提交详情中的答案一栏为空

输入

  • 第一行 22 个整数,分别表示 a,b
  • 1≤a,b≤109

输出

  • 一行,四个整数,表示分别需要掷出 a,b,−a,−b 多少次

样例 1

输入

4 11

输出

3 0 0 1
#include <bits/stdc++.h>
using namespace std;

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



int main()
{
    while(cin>>a>>b)
    {
        int x,y;
        if(__gcd(a,b)!=1)
        {
            cout<<"-1"<<endl;
            break;
        }
        else
        {
            exgcd(a,b,x,y);
            if(x>=0&&y>=0)
                cout<<x<<" "<<y<<" 0"<<" 0"<<endl;
            if(x<0&&y>=0)
                cout<<"0 "<<y<<" "<<abs(x)<<" 0"<<endl;
            if(x>=0&&y<0)
                cout<<x<<" "<<"0"<<" 0 "<<abs(y)<<endl;
            if(x<0&&y<0)
                cout<<"0"<<" "<<"0 "<<abs(x)<<" "<<abs(y)<<endl;
        }
    }
}

拓展拓展欧几里得算法:

https://blog.youkuaiyun.com/destiny1507/article/details/81750874?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164536324816780357298428%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164536324816780357298428&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-81750874.pc_search_result_cache&utm_term=%E6%8B%93%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值