//#pragma GCC optimize("O3") //#pragma GCC optimize("unroll-loops") #include #include //#include //#include using namespace std; #include #include #include #include #include #include #include #include #include #include #include #define ll long long #define ld long double #define overload4(_1, _2, _3, _4, name, ...) name #define overload3(_1, _2, _3, name, ...) name #define rep1(n) for (ll i = 0; i < n; ++i) #define rep2(i, n) for (ll i = 0; i < n; ++i) #define rep3(i, a, b) for (ll i = a; i < b; ++i) #define rep4(i, a, b, c) for (ll i = a; i < b; i += c) #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define rrep1(n) for (ll i = n; i--;) #define rrep2(i, n) for (ll i = n; i--;) #define rrep3(i, a, b) for (ll i = b; i-- > (a);) #define rrep4(i, a, b, c) for (ll i = (a) + ((b) - (a)-1) / (c) * (c); i >= (a); i -= c) #define rrep(...) overload4(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__) #define each1(i, a) for (auto &&i : a) #define each2(x, y, a) for (auto &&[x, y] : a) #define each3(x, y, z, a) for (auto &&[x, y, z] : a) #define each(...) overload4(__VA_ARGS__, each3, each2, each1)(__VA_ARGS__) #define elif else if // // void print() // // { // // putchar(' '); // // } // // void print(bool a) { printf("%d", a); } // // void print(int a) { printf("%d", a); } // // void print(unsigned a) { printf("%u", a); } // // void print(long a) { printf("%ld", a); } // // void print(long long a) { printf("%lld", a); } // // void print(unsigned long long a) { printf("%llu", a); } // // void print(char a) { printf("%c", a); } // // void print(char a[]) { printf("%s", a); } // // void print(const char a[]) { printf("%s", a); } // // void print(float a) { printf("%.15f", a); } // // void print(double a) { printf("%.15f", a); } // // void print(long double a) { printf("%.15Lf", a); } // // void print(const string &a) // // { // // for (auto &&i : a) // // print(i); // // } // // template // // void print(const complex &a) // // { // // if (a.real() >= 0) // // print('+'); // // print(a.real()); // // if (a.imag() >= 0) // // print('+'); // // print(a.imag()); // // print('i'); // // } // // template // // void print(const vector &); // // template // // void print(const array &); // // template // // void print(const pair &p); // // template // // void print(const T (&)[size]); // // template // // void print(const vector &a) // // { // // if (a.empty()) // // return; // // print(a[0]); // // for (auto i = a.begin(); ++i != a.end();) // // { // // putchar(' '); // // print(*i); // // } // // } // // template // // void print(const deque &a) // // { // // if (a.empty()) // // return; // // print(a[0]); // // for (auto i = a.begin(); ++i != a.end();) // // { // // putchar(' '); // // print(*i); // // } // // } // // template // // void print(const array &a) // // { // // print(a[0]); // // for (auto i = a.begin(); ++i != a.end();) // // { // // putchar(' '); // // print(*i); // // } // // } // // template // // void print(const pair &p) // // { // // print(p.first); // // putchar(' '); // // print(p.second); // // } // // template // // void print(const T (&a)[size]) // // { // // print(a[0]); // // for (auto i = a; ++i != end(a);) // // { // // putchar(' '); // // print(*i); // // } // // } // // template // // void print(const T &a) { cout << a; } // // int out() // // { // // putchar('\n'); // // return 0; // // } // // template // // int out(const T &t) // // { // // print(t); // // putchar('\n'); // // return 0; // // } // // template // // int out(const Head &head, const Tail &...tail) // // { // // print(head); // // putchar(' '); // // out(tail...); // // return 0; // // } // // string alphabet = "abcdefghijklmnopqrstuvwxyz"; // // void print_array(vector a) // // { // // auto L = a.size(); // // for (int i = 0; i < L; i++) // // { // // printf("%lld", a[i]); // // if (i != L - 1) // // { // // printf(" "); // // } // // else // // { // // printf("\n"); // // } // // } // // } // // ll gcd(ll a, ll b) // // { // // if (a % b) // // return gcd(b, a % b); // // else // // return b; // // } // void dijkstra(ll s) // { // pq, greater

> que; // fill(d, d + V, 10000000000); // d[s] = 0; // que.push(P(0, s)); // while (!que.empty()) // { // P p = que.top(); // que.pop(); // ll v = p.second; // if (d[v] < p.first) // continue; // rep(g[v].size()) // { // edge e = g[v][i]; // if (d[e.to] > d[v] + e.cost) // { // d[e.to] = d[v] + e.cost; // que.push(P(d[e.to], e.to)); // } // } // } // } /** * @brief Union-Find * @docs docs/union-find.md */ struct UnionFind { vector data; UnionFind() = default; explicit UnionFind(size_t sz) : data(sz, -1) {} bool unite(int x, int y) { x = find(x), y = find(y); if (x == y) return false; if (data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; return true; } int find(int k) { if (data[k] < 0) return (k); return data[k] = find(data[k]); } int size(int k) { return -data[find(k)]; } bool same(int x, int y) { return find(x) == find(y); } // vector > groups() // { // int n = (int)data.size(); // vector > ret(n); // for (int i = 0; i < n; i++) // { // ret[find(i)].push_back(i); // } // ret.erase(remove_if(begin(ret), end(ret), [&](const vector &v) // { return v.empty(); })); // return ret; // } }; // #define pq priority_queue // struct edge // { // ll to, cost; // }; // typedef pair P; // vector g[300000]; // ll dist[300000]; // ll dist2[300000]; // ll n, r; // void dijkstra(ll s) // { // priority_queue, greater

> que; // fill(dist, dist + n, 10000000000); // fill(dist2, dist2 + n, 10000000000); // dist[s] = 0; // que.push(P(0, s)); // while (!que.empty()) // { // P p = que.top(); // que.pop(); // ll v = p.second; // ll d = p.first; // if (dist2[v] < d) // continue; // rep(g[v].size()) // { // edge &e = g[v][i]; // ll d2 = d + e.cost; // if (dist[e.to] > d2) // { // swap(dist[e.to], d2); // que.push(P(dist[e.to], e.to)); // } // if (dist2[e.to] > d2 && dist[e.to] < d2) // { // dist2[e.to] = d2; // que.push(P(dist2[e.to], e.to)); // } // } // } // printf("%ld\n", dist[n - 1]); //} // sort(a.begin(), a.end(), [](const vector &alpha, const vector &beta) // { return alpha[2] > beta[2]; }); ll kruskal(ll n, vector> edge) { ll res = 0; UnionFind a(n); for (int i = 0; i < edge.size(); i++) { if (!a.same(edge[i][0], edge[i][1])) { res += edge[i][2]; a.unite(edge[i][0], edge[i][1]); } } return res; } // sort(a.begin(), a.end(), [](const vector &alpha, const vector &beta) // { return alpha[2] < beta[2]; }); long long modpow(long long a, long long n, long long mod) { long long res = 1; while (n > 0) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } ll MOD = 1000000007; int main() { ll a, b, n; cin >> a >> b >> n; ll res = 1; ll cnt[b + 2]; rep(i, b + 2) { // cout << i << endl; cnt[i] = 0; } for (int i = b; i > 1; i--) { // cout << i << endl; ll t = b / i - (a - 1) / i; // cout << t << endl; cnt[i] = modpow(t, n, MOD); rep(j, 2, 1000000000) { if (j * i > b) break; cnt[i] -= cnt[i * j]; cnt[i] %= MOD; } //cout << "cnt" << i << ":" << cnt[i] << endl; } res = 1; rep(i, 2, b + 1) { //cout << i << " " << cnt[i] << " " << modpow(i, cnt[i],MOD) << endl; res *= modpow(i, (cnt[i] + MOD) % MOD,MOD); res %= MOD; // cout << res << endl; } cout << res << endl; }