// Greatest Common Denominator (Multi-argument; C++14 version).
#include <type_traits>
#include <iostream>
template<typename M, typename N>
std::common_type_t<M, N>
gcd(M m, N n)
{
if (n == 0)
return m;
return gcd(n, m % n);
}
template<typename M, typename N, typename... Rest>
std::common_type_t<M, N, Rest...>
gcd(M m, N n, Rest... rest)
{
return gcd(m, gcd(n, rest...));
}
// Main.
int main()
{
std::cout << gcd(1, 2) << std::endl;
std::cout << gcd(2, 4, 6) << std::endl;
std::cout << gcd(3, 6, 9, 12) << std::endl;
}
Ly8gR3JlYXRlc3QgQ29tbW9uIERlbm9taW5hdG9yIChNdWx0aS1hcmd1bWVudDsgQysrMTQgdmVyc2lvbikuCgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPHR5cGVuYW1lIE0sIHR5cGVuYW1lIE4+CnN0ZDo6Y29tbW9uX3R5cGVfdDxNLCBOPgpnY2QoTSBtLCBOIG4pCnsKICAgIGlmIChuID09IDApCiAgICAgICAgcmV0dXJuIG07CiAgICByZXR1cm4gZ2NkKG4sIG0gJSBuKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgTSwgdHlwZW5hbWUgTiwgdHlwZW5hbWUuLi4gUmVzdD4Kc3RkOjpjb21tb25fdHlwZV90PE0sIE4sIFJlc3QuLi4+CmdjZChNIG0sIE4gbiwgUmVzdC4uLiByZXN0KQp7CiAgICByZXR1cm4gZ2NkKG0sIGdjZChuLCByZXN0Li4uKSk7Cn0KCi8vIE1haW4uCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCA8PCBnY2QoMSwgMikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGdjZCgyLCA0LCA2KSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgZ2NkKDMsIDYsIDksIDEyKSA8PCBzdGQ6OmVuZGw7Cn0=