#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
#define rep(a, b) for(ll a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const ll MOD=1e9+7;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
ll n, m, k;
cin >> n >> m >> k;
ll sum=0;
rep(i, k) {
string s;
cin >> s;
ll akt=1ll<<(m-1);
bool ok=true;
rep(j, m) {
if(!ok) akt/=2;
if(s[j]=='C') sum+=akt; else sum-=akt;
if(j+1<m && s[j]!=s[j+1]) ok=false;
}
}
cout << (sum==0?1:0) << " " << (n==k?"\n":"");
if(n==k) return 0;
ll zero=(1ll<<(m-1))*m*n+10;
vector<ll>dp(2*zero);
dp[zero]=1;
rep(xd, n-k) {
vector<ll>dp2(2*zero);
for(ll j=1; j<m; ++j) {
vector<ll>dodaj(2*zero);
ll p=0, krok=1;
rep(i, m-j-1) {
p+=1ll<<(m-i-3);
krok=1ll<<(m-i-2);
}
rep(i, 2*zero) if(dp[i]) {
ll d=i+(1ll<<(m-1))*j-(1ll<<(m-2));
d-=p;
dodaj[d]=(dodaj[d]+dp[i])%MOD;
d+=2*p+krok;
if(d<dodaj.size()) dodaj[d]=(dodaj[d]-dp[i]+MOD)%MOD;
d=i-(1ll<<(m-1))*j+(1ll<<(m-2));
d-=p;
dodaj[d]=(dodaj[d]+dp[i])%MOD;
d+=2*p+krok;
if(d<dodaj.size()) dodaj[d]=(dodaj[d]-dp[i]+MOD)%MOD;
}
rep(i, 2*zero) {
if(i+krok<dodaj.size()) dodaj[i+krok]=(dodaj[i+krok]+dodaj[i])%MOD;
dp2[i]=(dp2[i]+dodaj[i])%MOD;
}
}
rep(i, 2*zero) {
ll a=i+m*(1ll<<(m-1));
if(a<dp2.size()) dp2[a]=(dp2[a]+dp[i])%MOD;
a=i-m*(1ll<<(m-1));
if(a>=0) dp2[a]=(dp2[a]+dp[i]+MOD)%MOD;
}
dp=dp2;
cout << dp[zero-sum] << " ";
}
cout << '\n';
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include<bits/stdc++.h> using namespace std; typedef long double ld; typedef long long ll; #define rep(a, b) for(ll a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const ll MOD=1e9+7; int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n, m, k; cin >> n >> m >> k; ll sum=0; rep(i, k) { string s; cin >> s; ll akt=1ll<<(m-1); bool ok=true; rep(j, m) { if(!ok) akt/=2; if(s[j]=='C') sum+=akt; else sum-=akt; if(j+1<m && s[j]!=s[j+1]) ok=false; } } cout << (sum==0?1:0) << " " << (n==k?"\n":""); if(n==k) return 0; ll zero=(1ll<<(m-1))*m*n+10; vector<ll>dp(2*zero); dp[zero]=1; rep(xd, n-k) { vector<ll>dp2(2*zero); for(ll j=1; j<m; ++j) { vector<ll>dodaj(2*zero); ll p=0, krok=1; rep(i, m-j-1) { p+=1ll<<(m-i-3); krok=1ll<<(m-i-2); } rep(i, 2*zero) if(dp[i]) { ll d=i+(1ll<<(m-1))*j-(1ll<<(m-2)); d-=p; dodaj[d]=(dodaj[d]+dp[i])%MOD; d+=2*p+krok; if(d<dodaj.size()) dodaj[d]=(dodaj[d]-dp[i]+MOD)%MOD; d=i-(1ll<<(m-1))*j+(1ll<<(m-2)); d-=p; dodaj[d]=(dodaj[d]+dp[i])%MOD; d+=2*p+krok; if(d<dodaj.size()) dodaj[d]=(dodaj[d]-dp[i]+MOD)%MOD; } rep(i, 2*zero) { if(i+krok<dodaj.size()) dodaj[i+krok]=(dodaj[i+krok]+dodaj[i])%MOD; dp2[i]=(dp2[i]+dodaj[i])%MOD; } } rep(i, 2*zero) { ll a=i+m*(1ll<<(m-1)); if(a<dp2.size()) dp2[a]=(dp2[a]+dp[i])%MOD; a=i-m*(1ll<<(m-1)); if(a>=0) dp2[a]=(dp2[a]+dp[i]+MOD)%MOD; } dp=dp2; cout << dp[zero-sum] << " "; } cout << '\n'; } |
English