POJ 1850

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int fac(int num);
 6 
 7 int C(int n,int m);
 8 int com( int n, int k );
 9 int main()
10 {
11     //freopen("acm.acm","r",stdin);
12     string s;
13     int sum;
14     int j;
15     int i;
16 //    cout<<com(4,2)<<endl;
17 
18     while(cin>>s)
19     {
20         sum = 0;
21         for(i = 0; i < s.length()-1; ++ i)//把前面的都加起来,看看这个字符串len-1个长度的+len-2····1的字符串一共有多少个
22         {
23             sum += com(26,i+1);
24         }
25 //        cout<<s<<endl;
26 //        cout<<"sum        "<<sum<<endl;
27     
28         //cout<<"len "<<s.length()<<endl;
29         for(i = 0; i < s.length(); ++ i)
30         {
31             for(j = i+1; j < s.length(); ++ j)
32             {
33                 if(s[i] >= s[j])
34                 {
35                     break;
36                 }
37             }
38             if(j != s.length()) //
39             {
40                 break;
41             }
42         }
43         if(i != s.length())    //如果字符串不是按照升序排列的,那么要输出0;
44         {
45             cout<<0<<endl;
46             continue;
47         }
48         for(i = 0; i < s.length(); ++ i)    //看看当前的字符串在“本长度”中排在什么样的位置。
49         {
50             if(i == 0)
51             {
52                 j = 0;
53             }
54             else
55             {
56                 j = s[i-1]-'a'+1;
57             }
58             for(; j < s[i]-'a'; ++ j)    //现在依然是在计算 与当前字符串一样长度的字符串的数量(之前的 ~ )
59             {
60                 sum += com(26-j-1,s.length()-i-1);//这个组合是固定开头的字符,选取后面的!
61             }//计算的过程是比如说第一个位置是k,开始固定'a'那么以后的len-1个位置上就是从b~z中选出组合,然后再固定b再选,……
62                         //直到第一个位置是k本身,第一个位置枚举完了,枚举地二个位置,从a开始直到第二个位置的字符本身,依次类推,直到最后一个字符枚举完毕,本        //字符串之前的就算计算完了 因为这样枚举都是本字符串之前                        //的了~
63         }
64         cout<<sum+1<<endl;
65 
66     }
67 }
68 
69 int C(int n,int m)
70 {
71     return fac(n)/(fac(m)*fac(n-m));
72 }
73 
74 int fac(int num)
75 {
76     int i;
77     int sum = 1;
78     for(i = 1; i <= num; ++ i)
79     {
80         sum *= i;
81     }
82     return sum;
83 }
84 
85 int com( int n, int k )  //如果用常规的 以前的很笨的方法,会造成大数的溢出
86 {
87 
88 if ( k>0 )
89 {
90    return com(n-1, k-1 ) * n / k;//组合公式
91 }
92 return 1;
93 }

关注我的公众号,当然,如果你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。 

技术网站地址: vmfor.com

原文地址:https://www.cnblogs.com/gavinsp/p/4566562.html