dp
dp[j]表示與目標狀態有j位不同的方法數
#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <vector>
#include <cstdio>
#include <set>
#include <algorithm>
#include <map>
#include <string>
#include <queue>
#define LL long long
using namespace std;
const int maxn = 100100;
const int mod = 1000000009;
LL C[110][110];
LL dp[2][110];
void init() {
memset(C, 0, sizeof(C));
C[0][0] = 1;
for(int i = 0; i < 101; ++ i) {
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; ++ j) {
C[i][j] = (C[i-1][j] + C[i-1][j-1])%mod;
}
}
}
int main()
{
init();
int n, k, m;
char s1[110], s2[110];
while(scanf("%d%d%d", &n, &k, &m) == 3) {
scanf("%s%s", s1, s2);
int cnt = 0;
for(int i = 0; i < n; ++ i) {
if(s1[i] != s2[i]) cnt++;
}
memset(dp, 0, sizeof(dp));
dp[0][cnt] = 1;
int pre = 0;
for(int i = 0; i < k; ++ i) {
memset(dp[1-pre], 0, sizeof(dp[1-pre]));
for(int j = 0; j <= n; ++ j) {
if(dp[pre][j]) {
for(int q = max(0, m-n+j); q <= j && q <= m; ++ q) {
dp[1-pre][j+m-2*q] += dp[pre][j]*C[j][q]%mod*C[n-j][m-q]%mod;
dp[1-pre][j+m-2*q] %= mod;
}
}
}
pre ^= 1;
}
//printf("%I64d\n", dp[1-pre][0]);
printf("%lld\n", dp[pre][0]);
}
return 0;
}