排列组合...
长度为n的总方案共有 c (26, n)
对于 vwxyz 来说 是从 a -> ab -> abc -> abcd ->abcde ->vwxyz
所以先加上之前的总组合数 c (26, 1) + c (26, 2) + c(26, 3) + c(26, 4)
再来看 abcde ->vwxyz
a_ _ _ _ -> 需要 a -> b -> c ..... -> u -> v 即 c(25-‘a’ - ‘0’, 4) + c (25-‘b’ - ‘0’, 4) + ...(25-‘u’ - ‘0’, 4)
b_ _ _ - > a
c_ _ -> b
d_ -> c
e - > d
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 10;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = acos (-1.0);
#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)
int c[27][27], ch[27];
void calc ();
int main ()
{
calc ();
string a;
cin >> a;
ll ans = 0;
int len = a.length();
for (int i=1; i<len; i++)
{
if (a[i] <= a[i-1])
{
cout << 0;
return 0;
}
}
for (int i=1; i<=len-1; i++)
ans += c[26][i];
for (int i=0; i<len; i++)
{
for (int j = (i?a[i-1]-'a'+1:0); j<a[i]-'a'; j++)
ans += c[25-j][len-1-i];
}
cout << ans + 1 << endl;
return 0;
}
void calc ()
{
for (int i=0; i<27; i++)
for (int j=0; j<=i; j++)
{
if (j == 0 || i == j)
c[i][j] = 1;
else
c[i][j] = c[i-1][j] + c[i-1][j-1];
}
}