Problem: Problem B: B problem

2D enthusiasts (2D Respecters) from R University will participate in a programming training camp held at Atsu University. In this training camp, participants bring their own programming problems and use them for practice.

2DRespecters also ended up creating some issues. However, even three days before the training camp, the B problem had not been completed yet. The problem created by the person in charge of the first B problem was passed on after the C problem because the person in charge made it too difficult to constrain the problem. And no one wanted to deal with Problem B, which requires subtle adjustments to the difficulty level, which should not be too easy or too difficult. Since then, the chair of the person in charge of B problem has remained vacant.

Three days before the training camp, the Hope of 2D Respecters Expectations was finally launched to solve this problem. But he is not willing to create a B problem. He didn't want to create the B question himself, so he came up with a way to impose the person in charge of creating the B question on others. On the surface, his method determines who is responsible for creating the B problem equally.

His method is as follows.

* The person in charge of problem B is the person who takes the least amount of time to create the problem.
* If there are multiple people with the least work time, the person in charge of the problem with the smaller problem difficulty becomes the person in charge of creating the B problem.
* If there are multiple people with the least working time, and among them, there are multiple people with the lowest problem difficulty, he will be the person in charge of creating the B problem.

His method was well accepted by all members of 2D Respecters, as the seemingly least-working person was responsible for creating the B question.

However, his method has the following backs.

* Since each individual applies for the working hours verbally, it is possible to apply for a lie.
* If you apply for work hours that exceed the workable hours in question or negative work hours, you will be told that you are lying.
* It is known that the work time for creating a certain question is always an integral multiple of the difficulty level of the question, so even if you apply for work time contrary to this, it will be said to be a lie.

If the lie of the person who applied for the lie is revealed, that person will always be the person in charge of creating the B problem. Applications are made one by one in turn, and if a lie is revealed, it will be revealed at the time of application. When even one person finds a false application, the person in charge of creating the B problem will be decided, and no further applications will be made.

The applicant shall consider only the applications prior to him / her and apply for the minimum working time so that he / she will not be the person in charge of creating the B question at the time of application. At the time of application, if the applicant cannot report that he / she will not be the person in charge of creating the B problem, apply for the maximum working time that cannot be dismissed as a lie.

Create a program that asks who will be the B question creator when given a list of question difficulty levels for each individual in the order of application. Hope's application order is the last.

This question is fiction and has nothing to do with the process of creating this question.

Input

The input consists of multiple datasets, and the end of the dataset is represented by a line containing only two zeros separated by a single-byte space. The total number of datasets is 40 or less. In the first line of the dataset, the integer n (2 ≤ n ≤ ~~ 100 ~~ 1,000) and the integer m (1 ≤ m ≤ 1,000) are given separated by a single-byte space. In the second line of the dataset, the integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 1,000, 1 ≤ i ≤ n) are given separated by single-byte spaces.

The n and m on the first line represent the number of applicants and the working hours of the problem, respectively. The second line gives a list of question difficulty levels arranged in the order of application, where a_i represents the difficulty level of the question.

Output

For each data set, output the application order of the person in charge of creating the B question on one line.

Sample Input


3 100
3 7 4
5 24
4 6 12 3 8
5 1
1 1 2 2 3
0 0



Output for Sample Input


2
Four
Five






Example

Input

3 100
3 7 4
5 24
4 6 12 3 8
5 1
1 1 2 2 3
0 0


Output

2
4
5

Solution (in CPP):

Solution:
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <complex>
#include <utility>
#include <set>
#include <cmath>
#define loop(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a) loop(i,0,a)
#define pi acos(-1)
#define all(v) v.begin(),v.end()
#define EPS (1e-10)
#define EQ(a,b) (abs((a)-(b))<EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))
using namespace std;
typedef pair<int,int> point;
typedef complex<double> P;
typedef long long ll;

const double eps = 1e-8;
const double INF = 1e12;


double dot(P a,P b){
	return a.real()*b.real()+a.imag()*b.imag();
}
double cross(P a,P b){
	return a.real()*b.imag()-a.imag()*b.real();
}

bool is_orthogonal(P a1,P a2,P b1,P b2){
	return EQ(dot(a1-a2,b1-b2),0.0);
}
bool is_parallel(P a1,P a2,P b1,P b2){
	return EQ(cross(a1-a2,b1-b2),0.0);
}

bool is_point_on_line(P a,P b,P c){
	return EQ(cross(b-a,c-a),0.0);
}

bool is_point_on_linesegment3(P a,P b,P c){
	//|a-c| + |c-b|<=|a-b| ???????????????
	return (abs(a-c)+abs(c-b)<abs(a-b)+EPS);
}

double distance_l_p(P a,P b,P c){
	return abs(cross(b-a,c-a))/abs(b-a);
}


double distance_ls_p(P a,P b,P c){
	if(dot(b-a,c-a)<EPS)return abs(c-a);
	if(dot(a-b,c-b)<EPS)return abs(c-b);
	return abs(cross(b-a,c-a))/abs(b-a);
}

int ai[1000];
const int infi = 1<<29;
int n,m;

int solve(){
	int ans=-1;
	int min=infi,key=infi;
	bool h=false;
	for(int i=0;i<n;i++){
		vector<int> AI;
		AI.reserve(m+1);
		for(int j=0;j<=m;j+=ai[i])AI.push_back(j);
		vector<int> es;
		es.reserve(AI.size());
		for(int j=0,T=AI.size();j<T;j++){
			int t=AI[j];
			if(t>min || (t==min && ai[i]>=key))es.push_back(t);
		}
		if(!es.empty()){
			int t=es[0];
			if(t==min && ai[i]==key){
				h=true;
			}
		}else{
			h=false;
			min=AI.back();
			key=ai[i];
			ans=i;
		}
	}
	return h ? n:ans+1;
}

int main(){
	while(cin>>n>>m,n){
		for(int i=0;i<n;i++) cin>>ai[i];
			cout<<solve()<<endl;
	}
	return 0;
}