今天搞大素数搞了一天没弄明白,这题是组合数学的,接上篇当习题做的,感觉不错,把26个字母填入10以内格子的组合方法累加
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
using namespace std;
__int64 c[30][30];
void init()
{
int i,j;
for (i=0;i<30;i++)
for (j=0;j<=i;j++)
{
if (j==0||i==j) c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
}
return ;
}
int main()
{
init();
int i,j,n,a,m,b[20],k;
__int64 sum;
string str;
while (cin>>str)
{
int len=str.length();
sum=0;
for (i=0;i<len;i++)
sum+=c[26][i];
for (i=0;i<len;i++)
{
b[i]=(str[i]-'a'+1);
if (i&&b[i]<=b[i-1]) {sum=0;break;}
if (i)
for (j=b[i-1]+1;j<b[i];j++)
sum+=c[26-j][len-1-i];
else
for (j=1;j<b[i];j++)
sum+=c[26-j][len-1-i];
}
cout<<sum<<endl;
}
}