#include <bits/stdc++.h>
using namespace std;
#define int long long
/// O(SQRT(min(N,M))
int gcd_slow(int n, int m) {
if (n > m) {
swap(n, m);
}
int gcd = 1;
for (int i = 1, dv; i * i <= n; ++i) {
dv = i;
if (n % dv == 0 and m % dv == 0) {
gcd = max(gcd, i);
}
dv = n / i;
if (n % i == 0 and m % dv == 0) {
gcd = max(gcd, dv);
}
}
return gcd;
}
/// O(log(min(n,m))
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int fast_power(int base, int expo) { // log(expo)
if (expo == 0) {
return 1;
}
if (expo & 1) {
return base * fast_power(base, expo - 1);
}
int res = fast_power(base, expo / 2);
res *= res;
return res;
}
const int mod = 1e9 + 7;
int binary_power(int base, int expo) { // log(expo)
int res = 1;
while (expo) {
if (expo & 1) {
res = res * base % mod;
}
base = base * base % mod;
expo >>= 1;
}
return res;
}
int add(int a, int b) {
return (a % mod + b % mod) % mod;
}
int sub(int a, int b) {
return (a % mod - b % mod + mod) % mod;
}
int mul(int a, int b) {
return a % mod * (b % mod) % mod;
}
int dv(int a, int b) {
return mul(a, binary_power(b, mod - 2));
}
vector<int> inv, fact;
void build(int N) {
inv.assign(N + 1, 1);
fact.assign(N + 1, 1);
for (int i = 2; i <= N; ++i) {
fact[i] = mul(fact[i - 1], i);
inv[i] = binary_power(fact[i], mod - 2);
}
}
int ncr(int n, int r) {
if (r > n)return 0;
return mul(fact[n], mul(inv[r], inv[n - r]));
}
int npr(int n, int r) {
if (r > n)return 0;
return mul(fact[n], inv[n - r]);
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
build(1e6);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGludCBsb25nIGxvbmcKCi8vLyBPKFNRUlQobWluKE4sTSkpCmludCBnY2Rfc2xvdyhpbnQgbiwgaW50IG0pIHsKICBpZiAobiA+IG0pIHsKICAgIHN3YXAobiwgbSk7CiAgfQogIGludCBnY2QgPSAxOwogIGZvciAoaW50IGkgPSAxLCBkdjsgaSAqIGkgPD0gbjsgKytpKSB7CiAgICBkdiA9IGk7CiAgICBpZiAobiAlIGR2ID09IDAgYW5kIG0gJSBkdiA9PSAwKSB7CiAgICAgIGdjZCA9IG1heChnY2QsIGkpOwogICAgfQogICAgZHYgPSBuIC8gaTsKICAgIGlmIChuICUgaSA9PSAwIGFuZCBtICUgZHYgPT0gMCkgewogICAgICBnY2QgPSBtYXgoZ2NkLCBkdik7CiAgICB9CiAgfQogIHJldHVybiBnY2Q7Cn0KCi8vLyBPKGxvZyhtaW4obixtKSkKaW50IGdjZChpbnQgYSwgaW50IGIpIHsKICBpZiAoYiA9PSAwKSB7CiAgICByZXR1cm4gYTsKICB9CiAgcmV0dXJuIGdjZChiLCBhICUgYik7Cn0KCmludCBmYXN0X3Bvd2VyKGludCBiYXNlLCBpbnQgZXhwbykgeyAvLyBsb2coZXhwbykKICBpZiAoZXhwbyA9PSAwKSB7CiAgICByZXR1cm4gMTsKICB9CiAgaWYgKGV4cG8gJiAxKSB7CiAgICByZXR1cm4gYmFzZSAqIGZhc3RfcG93ZXIoYmFzZSwgZXhwbyAtIDEpOwogIH0KICBpbnQgcmVzID0gZmFzdF9wb3dlcihiYXNlLCBleHBvIC8gMik7CiAgcmVzICo9IHJlczsKICByZXR1cm4gcmVzOwp9CgoKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CgppbnQgYmluYXJ5X3Bvd2VyKGludCBiYXNlLCBpbnQgZXhwbykgeyAvLyBsb2coZXhwbykKICBpbnQgcmVzID0gMTsKICB3aGlsZSAoZXhwbykgewogICAgaWYgKGV4cG8gJiAxKSB7CiAgICAgIHJlcyA9IHJlcyAqIGJhc2UgJSBtb2Q7CiAgICB9CiAgICBiYXNlID0gYmFzZSAqIGJhc2UgJSBtb2Q7CiAgICBleHBvID4+PSAxOwogIH0KICByZXR1cm4gcmVzOwp9CgppbnQgYWRkKGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSAlIG1vZCArIGIgJSBtb2QpICUgbW9kOwp9CgppbnQgc3ViKGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSAlIG1vZCAtIGIgJSBtb2QgKyBtb2QpICUgbW9kOwp9CgppbnQgbXVsKGludCBhLCBpbnQgYikgewogIHJldHVybiBhICUgbW9kICogKGIgJSBtb2QpICUgbW9kOwp9CgppbnQgZHYoaW50IGEsIGludCBiKSB7CiAgcmV0dXJuIG11bChhLCBiaW5hcnlfcG93ZXIoYiwgbW9kIC0gMikpOwp9Cgp2ZWN0b3I8aW50PiBpbnYsIGZhY3Q7Cgp2b2lkIGJ1aWxkKGludCBOKSB7CiAgaW52LmFzc2lnbihOICsgMSwgMSk7CiAgZmFjdC5hc3NpZ24oTiArIDEsIDEpOwogIGZvciAoaW50IGkgPSAyOyBpIDw9IE47ICsraSkgewogICAgZmFjdFtpXSA9IG11bChmYWN0W2kgLSAxXSwgaSk7CiAgICBpbnZbaV0gPSBiaW5hcnlfcG93ZXIoZmFjdFtpXSwgbW9kIC0gMik7CiAgfQp9CgppbnQgbmNyKGludCBuLCBpbnQgcikgewogIGlmIChyID4gbilyZXR1cm4gMDsKICByZXR1cm4gbXVsKGZhY3Rbbl0sIG11bChpbnZbcl0sIGludltuIC0gcl0pKTsKfQoKaW50IG5wcihpbnQgbiwgaW50IHIpIHsKICBpZiAociA+IG4pcmV0dXJuIDA7CiAgcmV0dXJuIG11bChmYWN0W25dLCBpbnZbbiAtIHJdKTsKfQoKaW50MzJfdCBtYWluKCkgewogIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogIGNpbi50aWUobnVsbHB0cik7CiAgYnVpbGQoMWU2KTsKICByZXR1cm4gMDsKfQ==