#include <stdio.h>
#include <stdint.h>

#define MOD_BY 1000000007

int add(int a, int b) {
	return a + b - (a + b >= MOD_BY ? MOD_BY : 0);
}

int sub(int a, int b) {
	return b == 0 ? a : add(a, MOD_BY - b);
}

int mul(int a, int b) {
	return (int)(((int64_t)a * b) % MOD_BY);
}

int pou(int a, int b) {
	int r = 1;
	while (b > 0) {
		if (b & 1) r = mul(r, a);
		a = mul(a, a);
		b >>= 1;
	}
	return r;
}

int inv(int a) {
	return pou(a, MOD_BY - 2);
}

int dexibu(int a, int b) {
	return mul(a, inv(b));
}

int gcd(int a, int b) {
	while (b > 0) {
		int r = a % b;
		a = b;
		b = r;
	}
	return a;
}

int N, K;

int kazu(int baisu) {
	return pou(K / baisu, N);
}

int asumi[114514];

int main(void) {
	int i, j;
	int kotae = 0;
	if (scanf("%d%d", &N, &K) != 2) return 1;

	for (i = K; i >= 1; i--) {
		asumi[i] = kazu(i);
		for (j = i + i; j <= K; j += i) {
			asumi[i] = sub(asumi[i], asumi[j]);
		}
	}

	for (i = 1; i <= K; i++) {
		kotae = add(kotae, mul(i, asumi[i]));
	}

	printf("%d\n", kotae);
	return 0;
}

/*

gcdがx → A_1, ... , A_N がxの倍数

公約数にxがある → x以外のxの倍数が公約数にないなら、gcdがx (予想)

ユークリッドの互除法は速いのできっとなんとかなる

*/
