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 <stdio.h>
#include <math.h>
/*int gcd(int a,int b){
  int i;
  if(a<b){
    i=a;
    a=b;
    b=i;
  }
  do{
    i=a%b;
    a=b;
    b=i;
  }while(b!=0);
  return a;
}*/


unsigned long long ex(int a,unsigned long long b){
    int i=1;
    if(b==0){
        return i;
    }else if(b%2==0){
        i=i*ex(a,b/2)*ex(a,b/2)%1000000007;
        //printf("[%d,%d %d] ",i,a,b);
        return i;
    }else{
        i=i*ex(a,(b-1)/2)*ex(a,(b-1)/2)*a%1000000007;
        //printf("[%d,%d %d] ",i,a,b);
        return i;
    }
}

int main(){
  int n,k,sum=0,i;
  scanf("%d %d",&n,&k);
  unsigned long long A[k+1],j;
  for(i=k;i>=1;i--){
    A[i]=ex(k/i,n);
    //A[i]=pow(k/i,n);
    //printf("%d\n",A[i]);
  }
  for(i=k;i>=1;i--){
    for(j=2;j*i<=k;j++){
      A[i]-=A[j*i];
      //if(A[i]<0) printf("%d\n",A[i]);
    }
    //printf("%d\n",A[i]);
  }
  for(i=1;i<=k;i++){
    j=i*A[i];
    if(j>1000000007){
      j%=1000000007;
    }
    sum+=j;
    if(sum>1000000007){
      sum%=1000000007;
    }
  }
  printf("%d",sum);
  return 0;
}