1 /* 2 题意:每一次任选i,j行字符串进行任意长度前缀交换,然后不断重复这个过程,问在过程中,第一行字符串不同的个数 3 组合数学题:每一列不同的字母都有可能到第一行,所以每列的可能值相乘取模就行了。这题主要坑在题意理解上。。。 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <map> 10 using namespace std; 11 12 typedef long long ll; 13 const int MAXN = 1e2 + 10; 14 const int INF = 0x3f3f3f3f; 15 const int MOD = 1e9 + 7; 16 char s[MAXN][MAXN]; 17 int a[MAXN]; 18 map<char, int> cnt[MAXN]; 19 20 int main(void) //Codeforces Round #108 (Div. 2) C. Pocket Book 21 { 22 // freopen ("D.in", "r", stdin); 23 24 int n, m; 25 while (scanf ("%d%d", &n, &m) == 2) 26 { 27 memset (a, 0, sizeof (a)); 28 for (int i=1; i<=m; ++i) cnt[i].clear (); 29 scanf ("%s", s[1] + 1); 30 for (int i=2; i<=n; ++i) 31 { 32 scanf ("%s", s[i] + 1); 33 } 34 35 for (int j=1; j<=m; ++j) 36 { 37 for (int i=1; i<=n; ++i) 38 { 39 if (cnt[j][s[i][j]] == 0) 40 { 41 cnt[j][s[i][j]] = 1; a[j]++; 42 } 43 } 44 } 45 46 ll ans = 1; 47 for (int i=1; i<=m; ++i) 48 { 49 ans = (ans * a[i]) % MOD; 50 } 51 printf ("%I64d\n", ans); 52 } 53 54 return 0; 55 }
时间: 2024-11-05 14:54:59