递推,统计,数位DP水题,但这题在网上归为组合数学,不知道思路
#include <iostream> #include <cstdio> #include <cstring> #define LL long long using namespace std; LL f[11][30]; int main() { char s[11]; int i,j,k; for(i=0;i<26;i++) f[0][i]=1; for(i=1;i<10;i++) { for(j=0;j<(26-i);j++) { f[i][j]=0; for(k=j+1;k<(26-i+1);k++) { f[i][j]+=f[i-1][k]; } } } while(cin>>s) { int l=strlen(s); LL ans=0; for(i=0;i<l-1;i++) { for(j=0;j<(26-i);j++) ans+=f[i][j]; } for(i=0;i<l;i++) { if(i==0) j=0; else { if(s[i]<=s[i-1]) break; j=(s[i-1]-'a')+1; } for(;j<(s[i]-'a');j++) { ans+=f[l-1-i][j]; } } if(i==l) printf("%I64d\n",ans+1); else printf("0\n"); } return 0; }