コード
#include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> using namespace std; typedef long long ll; const ll MOD = 1000000007; const int MAX = 1000000; class Combination { private: vector<ll> inv, fact, invfact; Combination() {} public: Combination(int max) { inv.assign(max + 1, 0); fact.assign(max + 1, 0); invfact.assign(max + 1, 0); inv[1] = 1; for (int i = 2; i <= max; i++) inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD; fact[0] = invfact[0] = 1; for (int i = 1; i <= max; i++) fact[i] = fact[i - 1] * i % MOD; for (int i = 1; i <= max; i++) invfact[i] = invfact[i - 1] * inv[i] % MOD; } ll get(ll x, ll y) { return fact[x] * invfact[y] % MOD * invfact[x - y] % MOD; } }; ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; } ll lcm(ll x, ll y) { return x / gcd(x, y) * y; } int main() { ll H, W; cin >> H >> W; ll d = gcd(H, W); Combination c(d); ll ans = 0; ll cycle2 = H * W / d; for (ll i = 0; i <= d; ++i) { ll pattern = c.get(d, i); ll j = d - i; ll horizontal = W / gcd(W, i); ll vertical = H / gcd(H, j); ll cycle = lcm(vertical, horizontal); if (cycle == cycle2) { ans += pattern; while (ans > MOD) ans -= MOD; } } cout << ans << endl; }