Problem:
Score : 400 points

Problem Statement

You are given integers N and M.

Consider a sequence a of length N consisting of positive integers such that a_1 + a_2 + ... + a_N = M. Find the maximum possible value of the greatest common divisor of a_1, a_2, ..., a_N.

Constraints

All values in input are integers.

1 \leq N \leq 10^5

N \leq M \leq 10^9

Input

Input is given from Standard Input in the following format:

N M

Output

Print the maximum possible value of the greatest common divisor of a sequence a_1, a_2, ..., a_N that satisfies the condition.

Sample Input 1

3 14

Sample Output 1

2

Consider the sequence (a_1, a_2, a_3) = (2, 4, 8). Their greatest common divisor is 2, and this is the maximum value.

Sample Input 2

10 123

Sample Output 2

3

Sample Input 3

100000 1000000000

Sample Output 3

10000

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <malloc.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//ABC112D
int compare_int(const void *a, const void *b) { //sort
  return *(int*) a-*(int*) b;
}

void comdiv(int *div, int *menum, int *mepos, int i, int k, int tmp) {
  int ii, kk=0;
  if(k>=0){
    for(ii=0; ii<=menum[k]; ii++){
      comdiv(div, menum, mepos, i, k-1, tmp);
      tmp=tmp*mepos[k];
    }
  }else{
    while(div[kk]!=1){
      kk++;
    }
    div[kk]=tmp;
  }
}

int main(void) {
  int n, m, k=0, i, cou=0, tmp, flg, divisor=1;
  scanf("%d %d", &n, &m);
  int ma=m, menum[10000], mepos[10000];
  for(i=0; i<1000; i++){
    menum[i]=0, mepos[i]=0;
  }
  for(i=2; i<=m/2; i++){
    flg=0;
    while(ma%i==0){
      ma/=i, flg=1;
      menum[k]++, mepos[k]=i;
    }
    if(flg==1) k++;
  }
  menum[++k]=m,mepos[k]=i+1;
  for(i=0; i<k; i++)
    divisor*=menum[i]+1;

  int div[divisor];
  for(i=0; i<divisor; i++){
    div[i]=1;
  }
  comdiv(div, menum, mepos, i, k-1, 1);

  qsort(div, divisor, sizeof(int), compare_int); //sort

  i=0;
  while(n>div[i])
    i++;

  //printf("divisor=%d\n",divisor);
  //for(i=0; i<divisor; i++)printf("div[i]=%d",div[i]);
  printf("%d", m/div[i]);
}