# 分解质因数
mod=9901def fast(a,b):
res=1
a%mod
while b:
if b&1:
res=res*a%mod
a=a*a%mod
b>>=1
return resdef sum(p,k):
if k==1:
return 1
if (k%2==0):
return (1+fast(p,k//2))*sum(p,k//2)%mod
return (sum(p,k-1)+fast(p,k-1))%moddef prime(x,b):
i=2
res=1
while i*i<=x:
if x%i==0:
s=0
while x%i==0:
x//=i
s+=1
res=res*sum(i,s*b+1)%modi+=1
if x>1:
res=res*sum(x,b+1)%modreturn res
A,B=map(int,input().split())print(prime(A,B))
s1 = input()
s2 = input()
def x_split(s):
res = []
start = 0
for i in range(1, len(s)):
if s[i].isupper():
res.append(s[start:i])
start = i
res.append(s[start:])
return res
s1_ = x_split(s1)
s2_ = x_split(s2)
# 二维dp 最大公共子序列
n=len(s1_)
m=len(s2_)
dp=list([0 for _ in range (n+1) ]for _ in range (m+1))
for i in range(1,m+1):
for j in range(1,n+1):
if s1_[j-1]==s2_[i-1]:
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
print(dp[m][n])