组合数学题 Codeforces Round #108 (Div. 2) C. Pocket Book

 

题目传送门

 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 }

 

posted @ 2015-07-18 13:14  Running_Time  阅读(252)  评论(0编辑  收藏  举报