小珂的数学题

来源:互联网 发布:网络监管局官网 编辑:程序博客网 时间:2024/04/28 08:39

小珂的数学题

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

今天小珂在书上看到了一种数值表示方式,请你写一个程序帮助她迅速转化一下。题目信息如下:

         已知一种对应关系,从a开始按照字典序增加,字符串最长为5,遇到相同的或者后面的字符不比前面的大的字符串就不计数。

         a->1

         b->2

         ……

         ……

         z->26

ab->27

ac->28

……

……

vwxyz->83681

……

输入
会输入少于200行的数据,每一行有一个字符串。如果出现不符合规则的字符串(各个字符不是单调递增)的,输出0,否则输出它对应的数。(例如are 不合规则,对应输出0)
输出
输出每个结果,换行结束。
样例输入
azcatvwxyz
样例输出
126083681

思路:

主要是组合数学的内容, 运用两个公式

详情见:点击打开链接

//poj 166 小珂的数学题#include <stdio.h>#include <string.h>int c[27][27] = {0};char str[10];int main(){int i, j, len, ans;char tc;for(i = 0; i < 27; i++)          //用杨辉三角(递推)求c[i][j]:i个字母单调组成j位数的种数{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];}}}                     c[0][0] = 0;                //take care !while(scanf("%s", str) != EOF){len = strlen(str);for(i = 1; i < len; i++){if(str[i-1] >= str[i])   //若不递增输出0{printf("0\n");break;}}if(i != len){continue;}ans = 0;for(i = 1; i < len; i++){ans += c[26][i];     //将len位之前的所有种数相加}for(i = 0; i < len; i++){for(tc = (i ? str[i-1]+1 : 'a'); tc < str[i]; tc++)  //遍历之间所有字母{ans += c['z'-tc][len-i-1];     //将用大于tc的数排成后几位的种数}}printf("%d\n", ans+1);                 //之前的种数加1}return 0;}


0 0
原创粉丝点击