poj 1850 Code 递推

题目意思简单明了,求由小写字母组成的数列的顺序号 
a - 1 
b - 2 
... 
z - 26 
ab - 27 
... 
az - 51 
bc - 52
思路: 非常直接的做法 从最高位开始,求出把该位减小后能得到的数列数,最后再加上位数比他小的那些数列数目。

#include
#include
#include
using namespace std;
long   long ans;
char a[101];

long long work(int a,int b)
{
    long long sum=1;
    for(int i=a;i>=1;i--)
    sum*=b--;
    for(int i=a;i>1;i--)
    sum/=i;
    return(sum);
}

int main()
{
    scanf("%s",&a[1]);
    int lon=strlen(&a[1]);
    int ff=0;
    for(int i=1;i<=lon;i++)
    {
        if(a[i]-'a'+1<=ff)
        {
            printf("0\n");
            return(0);
        }
        ff=a[i]-'a'+1;
    }

    int tt=0;
    for(int i=1;i<=lon;i++)
    {
        int ll=a[i]-'a';
        for(int j=ll;j>tt;j--)
        ans+=work(lon-i,26-j);
        tt=ll+1;
    }
    for(int i=1;i
    {
        ans+=work(i,26);
    }
    printf("%lld\n",ans+1);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值