#include using namespace std; long long i, j, l, r, mid, p, q, k, t, n, m, a, b, c, d, h, w, ans, cnt, res; const long long mod = 1e9 + 7, mod2 = 999993469, inf = 1e18; string s; bool check; map mp, mp2; vector cur, cur2; long long binpow (long long a, long long b, long long mod){ a %= mod; long long res = 1; while (b > 0){ if (b % 2 == 1){ res = res * a % mod; } a = a * a % mod; b /= 2; } return res; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> h >> w >> k; for (a = 1; a <= sqrtl(h); a += 1){ if (h % a == 0){ cur.push_back(a); if (h / a != a){ cur.push_back(h / a); } } } sort(cur.begin(), cur.end()); m = cur.size(); for (i = m - 1; i >= 0; i -= 1){ p = cur[i]; mp[p] = h / p; for (j = m - 1; j >= i + 1; j -= 1){ if (cur[j] % p == 0){ mp[p] -= mp[cur[j]]; } } } for (a = 1; a <= sqrtl(w); a += 1){ if (w % a == 0){ cur2.push_back(a); if (w / a != a){ cur2.push_back(w / a); } } } sort(cur2.begin(), cur2.end()); m = cur2.size(); for (i = m - 1; i >= 0; i -= 1){ p = cur2[i]; mp2[p] = w / p; for (j = m - 1; j >= i + 1; j -= 1){ if (cur2[j] % p == 0){ mp2[p] -= mp2[cur2[j]]; } } } // for (i = 0; i < m; i += 1){ // cout << cur2[i] << " " << mp2[cur2[i]] << "\n"; // } ans = 0; for (a = 0; a < cur.size(); a += 1){ for (b = 0; b < cur2.size(); b += 1){ p = cur[a]; q = cur2[b]; // cout << p << " " << q << " " << p * q % mod * __gcd(h / p, w / q) % mod << " " << mp[p] << " " << mp2[q] << "\n"; ans = (ans + binpow(k, p * q % (mod - 1) * __gcd(h / p, w / q) % (mod - 1), mod) * mp[p] % mod * mp2[q] % mod) % mod; }// } cout << ans * binpow(h * w, mod - 2, mod) % mod << "\n"; }