import math
def find(u, par):
if par[u] != u:
par[u] = find(par[u], par)
return par[u]
def union(u, v, par, size):
u_root = find(u, par)
v_root = find(v, par)
if u_root == v_root:
return
if size[u_root] < size[v_root]:
par[u_root] = v_root
size[v_root] += size[u_root]
else:
par[v_root] = u_root
size[u_root] += size[v_root]
def ip():
return map(int,input().split())
def f(k):
# print()
curr=0
rem=-1
for i in range(n):
# print(i,curr,rem)
if curr==0 and b[i]>=k-1:
curr=1
continue
if curr<=a[i] and b[i]>=k-(curr+1):
curr+=1
# print(i,curr,rem)
if curr>=k:
return True
return False
T=1
# T=int(input())
for __ in range(T):
n,k=ip()
res=[]
if k>=n:
res=[chr(i+ord('a')) for i in range(n)]
print("".join(res))
continue
for i in range(k):
a=chr(i+ord('a'))
# if i==k:
# res.append(a)
# continue
for j in range(i,k):
b=chr(j+ord('a'))
if len(res)==n:
break
elif n-len(res)==1:
res.append(b)
else:
res.append(a)
res.append(b)
while len(res)<n:
res.append("a")
# print(len(res))
print("".join(res))
aW1wb3J0IG1hdGgKZGVmIGZpbmQodSwgcGFyKToKCiAgICBpZiBwYXJbdV0gIT0gdToKICAgICAgICBwYXJbdV0gPSBmaW5kKHBhclt1XSwgcGFyKQogICAgcmV0dXJuIHBhclt1XQoKZGVmIHVuaW9uKHUsIHYsIHBhciwgc2l6ZSk6CiAgICB1X3Jvb3QgPSBmaW5kKHUsIHBhcikKICAgIHZfcm9vdCA9IGZpbmQodiwgcGFyKQoKICAgIGlmIHVfcm9vdCA9PSB2X3Jvb3Q6CiAgICAgICAgcmV0dXJuIAoKCiAgICBpZiBzaXplW3Vfcm9vdF0gPCBzaXplW3Zfcm9vdF06CiAgICAgICAgcGFyW3Vfcm9vdF0gPSB2X3Jvb3QKICAgICAgICBzaXplW3Zfcm9vdF0gKz0gc2l6ZVt1X3Jvb3RdCiAgICBlbHNlOgogICAgICAgIHBhclt2X3Jvb3RdID0gdV9yb290CiAgICAgICAgc2l6ZVt1X3Jvb3RdICs9IHNpemVbdl9yb290XQoKZGVmIGlwKCk6CiAgICByZXR1cm4gbWFwKGludCxpbnB1dCgpLnNwbGl0KCkpCgpkZWYgZihrKToKICAgICMgcHJpbnQoKQogICAgY3Vycj0wCiAgICByZW09LTEKICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICMgcHJpbnQoaSxjdXJyLHJlbSkKCiAgICAgICAgaWYgY3Vycj09MCBhbmQgYltpXT49ay0xOgogICAgICAgICAgICBjdXJyPTEKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBjdXJyPD1hW2ldIGFuZCBiW2ldPj1rLShjdXJyKzEpOgogICAgICAgICAgICBjdXJyKz0xCiAgICAjIHByaW50KGksY3VycixyZW0pCiAgICBpZiBjdXJyPj1rOgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgoKCgpUPTEKIyBUPWludChpbnB1dCgpKQpmb3IgX18gaW4gcmFuZ2UoVCk6CiAgICBuLGs9aXAoKQogICAgcmVzPVtdCiAgICBpZiBrPj1uOgogICAgICAgIHJlcz1bY2hyKGkrb3JkKCdhJykpIGZvciBpIGluIHJhbmdlKG4pXQogICAgICAgIHByaW50KCIiLmpvaW4ocmVzKSkKICAgICAgICBjb250aW51ZQogICAgCgogICAgZm9yIGkgaW4gcmFuZ2Uoayk6CiAgICAgICAgYT1jaHIoaStvcmQoJ2EnKSkKICAgICAgICAjIGlmIGk9PWs6CiAgICAgICAgIyAgICAgcmVzLmFwcGVuZChhKQogICAgICAgICMgICAgIGNvbnRpbnVlCiAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSxrKToKICAgICAgICAgICAgYj1jaHIoaitvcmQoJ2EnKSkKICAgICAgICAgICAgaWYgbGVuKHJlcyk9PW46CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIG4tbGVuKHJlcyk9PTE6CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGEpCiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGIpCiAgICB3aGlsZSBsZW4ocmVzKTxuOgogICAgICAgIHJlcy5hcHBlbmQoImEiKQogICAgIyBwcmludChsZW4ocmVzKSkKICAgIHByaW50KCIiLmpvaW4ocmVzKSkK