Problem:
Score : 500 points

Problem Statement

Consider sequences \{A_1,...,A_N\} of length N consisting of integers between 1 and K (inclusive).

There are K^N such sequences. Find the sum of \gcd(A_1, ..., A_N) over all of them.

Since this sum can be enormous, print the value modulo (10^9+7).

Here \gcd(A_1, ..., A_N) denotes the greatest common divisor of A_1, ..., A_N.

Constraints

2 \leq N \leq 10^5

1 \leq K \leq 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the sum of \gcd(A_1, ..., A_N) over all K^N sequences, modulo (10^9+7).

Sample Input 1

3 2

Sample Output 1

9

\gcd(1,1,1)+\gcd(1,1,2)+\gcd(1,2,1)+\gcd(1,2,2)
+\gcd(2,1,1)+\gcd(2,1,2)+\gcd(2,2,1)+\gcd(2,2,2)
=1+1+1+1+1+1+1+2=9

Thus, the answer is 9.

Sample Input 2

3 200

Sample Output 2

10813692

Sample Input 3

100000 100000

Sample Output 3

742202979

Be sure to print the sum modulo (10^9+7).

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

const int MO=1e9+7;
const int M=2e5+5;

inline int add(int x,int y)
{
	x+=y;
	if(x>=MO) x-=MO;
	return x;
}
inline int sub(int x,int y)
{
	x-=y;
	if(x<0) x+=MO;
	return x;
}
inline int mul(int x,int y)
{
	return 1LL*x*y%MO;
}
inline void addv(int &x,int y)
{
	x+=y;
	if(x>=MO) x-=MO;
}
inline void subv(int &x,int y)
{
	x-=y;
	if(x<0) x+=MO;
}
inline void mulv(int &x,int y)
{
	x=1LL*x*y%MO;
}

int qp(int a,int n)
{
	int ans=1;
	while(n)
	{
		if(n&1) mulv(ans,a);
		mulv(a,a);
		n>>=1;
	}
	return ans;
}

int isp[M],pri[M],npri=0;
int mu[M];
void get_mu()
{
	mu[1]=1;
	for(int i=2;i<M;i++)
	{
		if(!isp[i])
		{
			pri[npri++]=i;
			mu[i]=-1;
		}
		for(int j=0;j<npri&&pri[j]*i<M;j++)
		{
			isp[i*pri[j]]=1;
			if(i%pri[j]==0)
			{
				mu[i*pri[j]]=0;
				break;
			}
			else
				mu[i*pri[j]]=-mu[i];
		}
	}
}

int f[M];

int main()
{
	get_mu();
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)
		f[i]=qp(k/i,n);
	int ans=0;
	for(int i=1;i<=k;i++)
	{
		int g=0;
		for(int j=1;j*i<=k;j++)
		{
			addv(g,mul(add(mu[j],MO),f[i*j]));
		}
		//cout<<i<<" "<<g<<endl;
		addv(ans,g*i);
	}
	printf("%d\n",ans);
	return 0;
}