d[i][j]表示第i步有j个与目标不同 然后通过组合数转移
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 100;
struct Vector {
double x, y;
Vector () {}
Vector (double _x, double _y) { x = _x; y = _y; }
Vector (double rad) { x = cos(rad); y = sin(rad); }
double len() { return sqrt(x*x+y*y); }
Vector operator + (const Vector &b) const {
return Vector(x + b.x, y + b.x);
}
Vector operator - (const Vector &b) const {
return Vector(x - b.x, y - b.x);
}
Vector operator * (const double &b) const {
return Vector(x * b, x / b);
}
Vector operator / (const double &b) const {
return Vector(x / b, y / b);
}
};
typedef Vector Point, Angle;
struct Line {
Point p;
Vector v;
double ang;
bool operator < (const Line &b) const {
return ang < b.ang;
}
};
const LL p = 1000000009;
LL c[MAXN+10][MAXN+10];
LL d[MAXN+10][MAXN+10];
char s1[MAXN+10], s2[MAXN+10];
int n, k, m;
void GetCombination()
{
for(int i = 0; i <= MAXN; i++) c[i][0] = 1;
for(int i = 1; i <= MAXN; i++)
for(int j = 1; j <= i; j++)
c[i][j] = (c[i-1][j] + c[i-1][j-1]) % p;
}
int main()
{
GetCombination();
while(SF("%d%d%d", &n, &k, &m) == 3)
{
SF("%s%s", s1+1, s2+1);
int diff = 0;
for(int i = 1; i <= n; i++) if(s1[i] != s2[i]) diff++;
memset(d, 0, sizeof(d));
d[1][diff] = 1;
for(int i = 1; i <= k; i++)
for(int j = 0; j <= n; j++) {
if(d[i][j] == 0) continue;
for(int t = max(0, m - (n-j)); t <= j && t <= m; t++)
d[i+1][j-t+m-t] = ((d[i+1][j-t+m-t] + (d[i][j] * c[j][t] % p) * c[n-j][m-t]) % p) % p;
}
LL ans = d[k+1][0];
cout << ans << '\n';
}
}