首页 > 代码库 > POJ 1850
POJ 1850
逐位确定其上可填的字母,组合数学题。
注意:当不符合规则时,要求输出0;
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string.h>using namespace std;int M[30][30];char s[30];int num[30];void initial(){ memset(M,0,sizeof(M)); for(int i=0;i<=26;i++) M[i][0]=1; for(int i=1;i<=26;i++){ for(int j=1;j<=i;j++){ if(j==1){ M[i][j]=i; } else { M[i][j]=M[i][j-1]*(i-j+1)/j; } } }}int main(){ initial(); while(scanf("%s",s)!=EOF){ int len=strlen(s); for(int i=1;i<=len;i++) num[i]=s[i-1]-‘a‘+1; num[0]=0; bool flag=true; for(int i=1;i<=len;i++) if(num[i]<=num[i-1]){ flag=false; break; } if(!flag){ printf("0\n"); continue; } int pos=0; for(int i=1;i<len;i++) pos+=M[26][i]; for(int i=1;i<=len;i++){ for(int k=num[i-1]+1;k<num[i];k++){ pos+=(M[26-k][len-i]); } } printf("%d\n",pos+1); } return 0;}
POJ 1850
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。