#include using namespace std; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef long long ll; typedef pair pi; typedef vector vi; typedef long double ld; #define all(v) begin((v)), end((v)) #define Unique(x) sort((x).begin(), (x).end()); (x).erase(unique((x).begin(), (x).end()), (x).end()); #define lb(v, x) lower_bound((v).begin(), (v).end(), x) - (v).begin() #define bit(x, y) (((x)>>(y))&1) #define debug(x) cerr << (#x) << " " << (x) << endl #define Timer 1.0 * clock() / CLOCKS_PER_SEC ll rd(ll l, ll r){return uniform_int_distribution(l, r)(rng);} const int mod = 1e9+7; template struct Mint { int v; static_assert(m > 0); Mint(ll value = 0): v(value % m) { if (v < 0) v += m; } friend istream& operator >> (istream& inp, Mint& a) { ll x; inp >> x; a = x; return inp; } friend ostream& operator << (ostream& out, const Mint& a) { out << a.v; return out; } Mint operator + () const { return *this; } Mint operator - () const { return Mint() - *this; } Mint& operator++() { ++v; if (v == m) v = 0; return *this; } Mint& operator--() { if (v == 0) v = m; --v; return *this; } Mint operator++(int) { Mint ans = *this; ++*this; return ans; } Mint operator--(int) { Mint ans = *this; --*this; return ans; } Mint& operator += (const Mint& other) { v += other.v; if (v >= m) v -= m; return *this; } Mint& operator -= (const Mint& other) { v -= other.v; if (v < 0) v += m; return *this; } Mint& operator *= (const Mint& other) { v = int64_t(v) * other.v % m; if (v < 0) v += m; return *this; } Mint inv() const { ll a = 1, b = 0; for (ll x = v, y = m; x != 0;) swap(a, b -= y / x * a), swap(x, y -= y / x * x); if (b < 0) b += m; return b; } Mint& operator /= (const Mint& other) { return *this *= other.inv(); } friend Mint operator + (const Mint& a, const Mint& b) { return Mint(a) += b; } friend Mint operator - (const Mint& a, const Mint& b) { return Mint(a) -= b; } friend Mint operator * (const Mint& a, const Mint& b) { return Mint(a) *= b; } friend Mint operator / (const Mint& a, const Mint& b) { return Mint(a) /= b; } friend bool operator == (const Mint& a, const Mint& b) { return a.v == b.v; } friend bool operator != (const Mint& a, const Mint& b) { return a.v != b.v; } }; using mint = Mint; mint bpow(mint a, ll b){ mint r = 1; while(b){ if(b & 1) r *= a; a *= a; b >>= 1; } return r; } int h, w, k; vector init(int x){ vector pf; for(int i = 1; i * i <= x; i++){ if(x % i == 0){ pf.push_back(i); if(i * i != x) pf.push_back(x / i); } } sort(all(pf)); vector z(pf.size()); for(int i = 0; i < pf.size(); i++){ z[i].first = pf[i]; int g = x/pf[i]; int phi = g, v = g; for(int j = 2; j * j <= g; j++){ if(v % j == 0){ phi -= phi / j; while(v % j == 0) v /= j; } } if(v > 1) phi -= phi / v; z[i].second = phi; } return z; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> h >> w >> k; vector hp = init(h), wp = init(w); // for(auto [x, y]:hp) cout << x << " " << y << "\n"; // cout << "\n"; // for(auto [x, y]:wp) cout << x << " " << y << "\n"; mint ans = 0; for(auto &[x, y]:hp){ for(auto &[u, v]:wp){ ll val = (1ll * x * u) % (mod - 1); val = (1ll * val * gcd(h/x, w/u)) % (mod-1); // cout << x << " " << y << " " << u << " " << v << " " << val << "\n"; ans += bpow(k, val) * y * v; } } // cout << ans << "\n"; cout << ans * mint(1ll * h * w).inv(); return 0; }