Problem: Let's define the cost of a string s as the number of index pairs i and j (1 ≤ i < j < |s|) such that s_i = s_j and s_{i+1} = s_{j+1}.

You are given two positive integers n and k. Among all strings with length n that contain only the first k characters of the Latin alphabet, find a string with minimum possible cost. If there are multiple such strings with minimum cost — find any of them.

Input

The only line contains two integers n and k (1 ≤ n ≤ 2 ⋅ 10^5; 1 ≤ k ≤ 26).

Output

Print the string s such that it consists of n characters, each its character is one of the k first Latin letters, and it has the minimum possible cost among all these strings. If there are multiple such strings — print any of them.

Examples

Input


9 4


Output


aabacadbb


Input


5 1


Output


aaaaa

Input


10 26


Output


codeforces

Solution (in JAVA):

Solution:

import java.awt.List;
import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;


public class Edu107 {
	static PrintWriter out;
	static Scanner sc;
	static StringBuilder sb;
	static ArrayList<Integer>q,w,primes;
	static ArrayList<Integer>adj[];
	static HashSet<Integer>primesH;
	static boolean prime[];
	//static ArrayList<Integer>a;
	static HashSet<Long>tmp;
	static boolean[]v;
	static int[]a,b,c,d;
	static long l[],dp[][][];
	static char[][]mp;
	static int A,B,n,m,h,cnt,k;
	static long oo=((long)1e9)+7;
	public static void main(String[]args) throws IOException {
		sc=new Scanner(System.in);
		out=new PrintWriter(System.out);
		//A();
		//B2();
	  ///  C();
	//	CC();
		D2();
		//E();
		//minimum for subarrays of fixed length
		//F();
		out.close();
	}
	static long gcd (long a, long b) {
	    return b==0?a:gcd (b, a % b);
	}
	static long lcm (long a, long b) {
	    return (b*a)/gcd (a,b);
	}
	  private static void A() throws IOException {
		  int t=ni();
			while(t-->0) {
				int n=ni();
				int[]a=nai(n);
				int u1=0;
				for(int i=0;i<n;i++) {
					if(a[i]==2)u1++;
				}
				ol(n-u1);
			}
		
	   }
		static void B() throws IOException {
			int t=ni();
			primes=new ArrayList<Integer>();
			sieveOfEratosthenes(10000020);
			while(t-->0) {
				int a=ni(),b=ni(),c=ni();
				//ol(""+gcd(140133 ,160776));
				int lo=0,hi=primes.size()-1;
				while(lo<=hi) {
					int mid=(lo+hi)/2;
					StringBuilder sb=new StringBuilder();
					int len=sb.append(primes.get(mid)).length();
					if(len==c) {
						break;
					}
					if(len<c)lo=mid+1;
					else hi=mid-1;
					
				}
				int cx=primes.get((lo+hi)/2);
				int a1=cx,a2=cx;
				if(c==9) {
					ol("100000190 100000190");
					continue;
				}
				if(c==Math.min(a, b)) {
					int p=Math.max(a, b);
					while(true) {
						StringBuilder sb=new StringBuilder();
						sb.append(a2);
						if(sb.length()==p)break;
						a2*=10;
					}
					if(c==b) {
						int tmp=a1;
						a1=a2;
						a2=tmp;
					}
					ol(a1+" "+a2);
				}else {
					int p1=Math.min(a, b);
					int p2=Math.max(a, b);
					lo=0;
					hi=primes.size()-1;
					while(lo<=hi) {
						int mid=(lo+hi)/2;
						StringBuilder sb=new StringBuilder();
						long cc=primes.get(mid)*1l*a1;
						int len=sb.append(cc).length();
						if(len==p1) {
							break;
						}
						if(len<p1)lo=mid+1;
						else hi=mid-1;
					}
					int mid=(lo+hi)/2;
					a1=primes.get(mid)*a1;
					if(p1==p2) {
						if(mid==0) {
							a2=primes.get(mid+1)*a2;
						}else if(mid==primes.size()-1){
							a2=primes.get(mid-1)*a2;
						}else {
							long c1=primes.get(mid+1)*1l*a2;
							long c2=primes.get(mid-1)*1l*a2;
							StringBuilder sb=new StringBuilder();
							int le1=sb.append(c1).length();
							//sb=new StringBuilder();
							//int le2=sb.append(c2).length();
							if(le1==p2)a2=primes.get(mid+1)*a2;
							else a2=primes.get(mid-1)*a2;
						}
					}else {
						lo=0;
						hi=primes.size()-1;
						while(lo<=hi) {
							mid=(lo+hi)/2;
							StringBuilder sb=new StringBuilder();
							long cc=primes.get(mid)*1l*a2;
							int len=sb.append(cc).length();
							if(len==p2) {
								break;
							}
							if(len<p2)lo=mid+1;
							else hi=mid-1;
						}
						mid=(lo+hi)/2;
						a2=primes.get(mid)*a2;
						
					}
					if(b==p1) {
						int tmp=a1;
						a1=a2;
						a2=tmp;
					}
					ol(a1+" "+a2);
				}
				//ol(cx);
				//ol(primes.get(primes.size()-1));
			}
		}
		static void sieveOfEratosthenes(int n)  // O(n*log(log(n)))
	    { 
	        // Create a boolean array "prime[0..n]" and initialize 
	        // all entries it as true. A value in prime[i] will 
	        // finally be false if i is Not a prime, else true. 
	        boolean prime[] = new boolean[n+1]; 
	        for(int i=0;i<n;i++) 
	            prime[i] = true; 
	          
	        for(int p = 2; p*p <=n; p++) 
	        { 
	            // If prime[p] is not changed, then it is a prime 
	            if(prime[p] == true) 
	            { 
	                // Update all multiples of p 
	                for(int i = p*p; i <= n; i += p) 
	                    prime[i] = false; 
	            } 
	        } 
	          
	        // Print all prime numbers 
	        for(int i = 2; i <= n; i++) 
	        { 
	            if(prime[i] == true) {
	                //System.out.print(i + " "); 
	                primes.add(i);
	            }
	        } 
	    } 
		static void C() throws IOException{
			int t=1;
			while(t-->0) {
				int n=ni(),q=ni();
				int[]a=nai(n);
				int[]qs=nai(q);
				HashMap<Integer, Integer>tr=new HashMap<Integer, Integer>();
				for(int i=0;i<n;i++) {
					if(!tr.containsKey(a[i])) {
						tr.put(a[i], i);
					}
				}
				for(int i=0;i<q;i++) {
					int idx=tr.get(qs[i])+1;
					out.print(idx+" ");
					HashMap<Integer, Integer>tmp=new HashMap<Integer, Integer>();
					for(int x:tr.keySet()) {
						int y=tr.get(x);
						if(y<idx-1) {
							tmp.put(x, y+1);
						}
					}
					for(int x:tmp.keySet()) {
						tr.put(x, tmp.get(x));
					}
					tr.put(qs[i], 0);
				}
				ol("");
				
				
			}
		}

	static void D() throws IOException {
		int t=1;
		while(t-->0) {
			n=ni();
			k=ni();
			sb=new StringBuilder();
			if(k==1) {
				for(int i=0;i<n;i++)sb.append("a");
			}else if(k==2) {
				for(int i=0;i<n;i+=2) {
					if(i%4==0) {
						sb.append("a");
						if(i+1<n)sb.append("a");
					}else {
						sb.append("b");
						if(i+1<n)sb.append("b");
					}
				}
			}else {
				char[]c=new char[k];
				for(int i=0;i<k;i++) {
					c[i]=(char)('a'+i);
				}
				permute(c);
				if(cnt<n) {
					int i=0;
					while(cnt<n) {
						sb.append(sb.charAt(i));
						cnt++;
						if(cnt<n) {
							i++;
							sb.append(c[i]);
							cnt++;
						}
						i++;
					}
				}
			}
			ol(sb.toString());
					
		}
	}
	public static void permute(char[] nums) {
	    helper(0, nums);
	}
	 
	private static void helper(int start, char[] nums){
	    if(start==nums.length-1){
	    	if(cnt>=n)return;
	    	for(int i=0;cnt<n&&i<k;cnt+=2,i++) {
	    		sb.append(nums[i]);
	    		if(cnt+1<n)
	    			sb.append(nums[i]);
	    	}
	        return;
	    }
    	if(cnt==n)return;
	    for(int i=start; i<nums.length; i++){
	        swap(nums, i, start);
	        helper(start+1, nums);
	        swap(nums, i, start);
	    }
	}
	private static void swap(char[] nums, int i, int j){
	    char temp = nums[i];
	    nums[i] = nums[j];
	    nums[j] = temp;
	}
static void D2() throws IOException {
		
		int t=1;
		while(t-->0) {
			int n=ni(),k=ni();
			StringBuilder sb=new StringBuilder();
			int cn=0;
			char[]c=new char[k];for(int i=0;i<k;i++)c[i]=(char)('a'+i);
			int aa=0;
			for(int i=0;i<k;i++) {
				sb.append((char)('a'+i));
				for(int j=i+1;j<k;j++) {
					sb.append((char)('a'+i));
					sb.append((char)('a'+j));
				}
			}
			for(int i=0;i<n;i++)out.print(sb.charAt(i%sb.length()));
			ol("");
		}
	}
	static void B2() throws IOException {
		
		int t=ni();
		while(t-->0) {
			int a=ni(),b=ni(),c=ni();
			long aa=(long)Math.pow(10, a-1);
			long bb=(long)Math.pow(10, b-1);
			long cc=(long)Math.pow(10, c-1);
			if(a>c)aa+=cc;
			else if(b>c)bb+=cc;
			ol(aa+" "+bb);
		}
	}
	static class Tri implements Comparable<Tri>{
		int x,y,z;
		public Tri(int x,int y,int z) {
			this.x=x;
			this.y=y;
			this.z=z;
		}
		@Override
		public int compareTo(Tri t) {
			return t.z-z;
		}
		
	}
		private static void paint(char[][] mp, int i) {
		for(int j=0;j<mp.length;j++) {
			mp[j][i]='X';
		}
		if(i>1) {
			for(int a=0;a<mp.length;a++) {
				if(mp[a][i-2]=='X') {
					mp[a][i-1]='X';
					break;
				}
				if(a==mp.length-1) {
					mp[a][i-1]='X';
				}
			}
		}
		if(i<mp[0].length-2) {
			for(int a=0;a<mp.length;a++) {
				if(mp[a][i+2]=='X') {
					mp[a][i+1]='X';
					break;
				}
				if(a==mp.length-1) {
					mp[a][i+1]='X';
				}
			}
		}
		
	}
	static int ni() throws IOException {
		return sc.nextInt();
	}
	static double nd() throws IOException {
		return sc.nextDouble();
	}
	static long nl() throws IOException {
		return  sc.nextLong();
	}
	static String ns() throws IOException {
		return sc.next();
	}
	static int[] nai(int n) throws IOException {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)
			a[i] = sc.nextInt();
		return a;
	}
	static long[] nal(int n) throws IOException {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)
			a[i] = sc.nextLong();
		return a;
	}
	static int[][] nmi(int n,int m) throws IOException{
		int[][]a=new int[n][m];
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				a[i][j]=sc.nextInt();
			}
		}
		return a;
	}

	static long[][] nml(int n,int m) throws IOException{
		long[][]a=new long[n][m];
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				a[i][j]=sc.nextLong();
			}
		}
		return a;
	}
	static void o(String x) {
		out.print(x);
	}
	static void ol(String x) {
		out.println(x);
	}
	static void ol(int x) {
		out.println(x);
	}
	static void disp1(int []a) {
		for(int i=0;i<a.length;i++) {
			out.print(a[i]+" ");
		}
		out.println();
	}

	static class Scanner 
	{
		StringTokenizer st;
		BufferedReader br;

		public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

		public String next() throws IOException 
		{
			while (st == null || !st.hasMoreTokens()) 
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}
		public boolean hasNext() {return st.hasMoreTokens();}
		public int nextInt() throws IOException {return Integer.parseInt(next());}
		
		public double nextDouble() throws IOException {return Double.parseDouble(next());}
		
		public long nextLong() throws IOException {return Long.parseLong(next());}

		public String nextLine() throws IOException {return br.readLine();}
			
		public boolean ready() throws IOException {return br.ready(); }
		

	}
}