zoukankan      html  css  js  c++  java
  • 扩展欧几里德

    例题 双六游戏

    一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数。其中0号格子是起点,1号格子
    是终点。而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点
    掷出四个整数各多少次可以到达终点呢?如果解不唯一,输出任意一组即可。如果无解 输出impossible!

    可将此题转化成ax+by=1的形式

    我们使用和辗转相除法相似的思路,将extgcd(a,b,x,y)不断递归为extgcd(b,a%b,x,y),但同时我们要响应得更改x和y,即将x转化为上一次地规避的y,y转化为上一次递归的x-(a/b)*y。

    具体证明请自行百度

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int gcd(int a,int b)
    {     if(a<b)swap(a,b);
          if(a%b==0)return b;
          return gcd(b,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 z=x;
          x=y;
          y=z-(a/b)*y;
    }
    int main()
    {     int a,b,x,y,i,j,k;
          cin>>a>>b;
          if(gcd(a,b)!=1)puts("impossible!");
          exgcd(a,b,x,y);
          cout<<x<<' '<<y<<endl;
          return 0;
    }

  • 相关阅读:
    烤盐屋——Beta冲刺日志(2/7)
    团队作业第六次--Beta阶段随笔集合
    OneDay!——冲刺日志集合
    Beta冲刺答辩
    OneDay!——随机组队“吐槽”
    OneDay!——Beta冲刺总结
    用户使用调查报告
    Beta冲刺日志--Day 7
    Beta冲刺日志--Day 6
    Beta冲刺日志--Day 5
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/8325499.html
Copyright © 2011-2022 走看看