#include using namespace std; typedef long long ll; #define endl "\n" const ll MOD = 1e9 + 7; mapval; ll phi(ll n) { if(n == 1) { return 1; } if(val.count(n) == 1) { return val[n]; } ll n1 = n; ll ans = n, i; for(i = 2; i * i <= n; i++) { if(n % i == 0) { while(n % i == 0) { n /= i; } ans -= ans / i; } } if(n > 1) { ans -= ans / n; } val[n1] = ans; return ans; } ll mu(ll a, ll b) { ll ans = 1; while(b > 0) { if(b % 2 == 1) { ans *= a; ans %= MOD; } b /= 2; a *= a; a %= MOD; } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); ll t = 1; //cin >> t; while(t--) { ll n, m, k; cin >> n >> m >> k; vectordiv, div1; ll i; for(i = 1; i * i <= n; i++) { if(n % i == 0) { div.push_back(i); if(n / i != i) { div.push_back(n / i); } } } for(i = 1; i * i <= m; i++) { if(m % i == 0) { div1.push_back(i); if(m / i != i) { div1.push_back(m / i); } } } sort(div.begin(), div.end()); sort(div1.begin(), div1.end()); for(i = 0; i < div.size(); i++) { phi(n / div[i]); } for(i = 0; i < div1.size(); i++) { phi(m / div1[i]); } ll j, ans = 0; for(i = 0; i < div.size(); i++) { for(j = 0; j < div1.size(); j++) { ans += phi(n / div[i]) * phi(m / div1[j]) % MOD * mu(k, div[i] * div1[j] * __gcd(n / div[i], m / div1[j])) % MOD; ans %= MOD; //cout << div[i] << " " << div1[j] << " " << ans << endl; } } ans *= mu(n * m % MOD, MOD - 2); ans %= MOD; cout << ans << endl; } #ifndef ONLINE_JUDGE cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n"; #endif return 0; } // Author: tryharderforioi100