ACM模板库

ACM模板库


gcd与扩展gcd

<h2>使用方法</h2> <ol> <li> <p>使用命名空间</p> <pre><code class="language-cpp">using namespace algorithm</code></pre> </li> <li>然后直接使用函数即可</li> </ol> <p>[========]</p> <h2>函数说明</h2> <p>函数<code>Type getGcd(Type a, Type b)</code> 计算a与b的最大公约数,返回Type类型</p> <p>函数<code>Type getAnyCalc(Type a, Type b, Type c, Type1 &amp;x, Type1 &amp;y)</code> 计算ax+by=c的一组整数解</p> <blockquote> <p>注意: 当原式不可能存在整数解时,返回0 调用函数中之前,x与y不必赋初值,定义之后即可传入参数</p> </blockquote> <p>函数<code>Type getUpCalc(Type a, Type b, Type c, Type1 &amp;x, Type1 &amp;y)</code> 计算ax+by=c的最小非负整数解</p> <blockquote> <p>注意: 当原式不可能存在整数解时,返回0 调用函数中之前,x与y不必赋初值,定义之后即可传入参数 存在解但不存在最小非负整数解则计算靠近(0,0)的解 [========]</p> </blockquote> <h2>模板代码</h2> <pre><code class="language-cpp">namespace algorithm{ template &lt;class Type&gt; Type getGcd(Type a, Type b){ if(b == 0) return a; else return getGcd(b, a%b); } template &lt;class Type, class Type1&gt; Type getExgcd(Type a, Type b, Type1 &amp;x, Type1 &amp;y){ if(b == 0){ x = (Type1)1, y = (Type1)0; return a; } Type gcd = getExgcd(b, a%b, x, y); Type rx = x; x = y; y = rx - (Type1)a / b * y; return gcd; } template &lt;class Type, class Type1&gt; Type getAnyCalc(Type a, Type b, Type c, Type1 &amp;x, Type1 &amp;y){ Type gcd = getExgcd(a, b, x, y); if(c % gcd) return 0; Type transit = c / gcd; x *= (Type1)transit; y *= (Type1)transit; return gcd; } template &lt;class Type, class Type1&gt; Type getUpCalc(Type a, Type b, Type c, Type1 &amp;x, Type1 &amp;y){ Type gcd = getExgcd(a, b, x, y); if(c % gcd) return 0; Type transit = c / gcd; x *= (Type1)transit; y *= (Type1)transit; Type _a = a,_b = b; a /= gcd; b /= gcd; x = x % b &lt; 0? x % b + (b &lt; 0? -b: b): (x % b); y = y % a &lt; 0? y % a + (a &lt; 0? -a: a): (y % a); if(c &lt; 0) y = (c - _a * x) / _b; else x = (Type1)(c - _b * y) / _a; return gcd; } };</code></pre> <p>[========]</p>

页面列表

ITEM_HTML