Code(组合数学)

http://poj.org/problem?id=1850

题意:求所给字符串按照题目的编码规则,它的编码应是多少?

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define  LL long long
 4 
 5 double C(int a,int b)//计算组合数C(a,b)
 6 {
 7     if(a < b)
 8         return 0;
 9     double res = 1.0;
10     while(b > 0)
11     {
12         res*=(double)a--/(double)b--;
13     }
14     return res;
15 }
16 int main()
17 {
18     char s[120];
19     while(~scanf("%s",s))
20     {
21         LL ans = 0;
22         int len = strlen(s);
23         for (int i = 1; i < len; i++)
24         {
25             if (s[i]<s[i-1])//不合法的情况
26             {
27                 printf("0\n");
28                 return 0;
29             }
30         }
31         for (int i = 1; i < len; i++)//比所求字符串短的合法串的数目
32         {
33             ans+=C(26,i);
34         }
35         //和所求字符串长度相等的合法串的数目
36         for (int i = 'a'; i < s[0]; i++)//单独比较第一个字母
37         {
38             ans+=C('z'-i,len-1);
39         }
40         for (int i = 1; i < len; i++)
41         {
42             for (int j = s[i-1]+1; j < s[i]; j++)
43             {
44                 ans+=C('z'-j,len-i-1);
45             }
46         }
47         printf("%lld\n",ans+1);//所求字符串前面的合法串的数目加上串本身
48     }
49     return 0;
50 }
View Code

 

posted @ 2014-02-11 20:55  N_ll  阅读(151)  评论(0编辑  收藏  举报