首页 > 代码库 > POJ 1850
POJ 1850
一道比较复杂的模拟题
一步步从字母的最前方计算到最后方即可
1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 #define ll long long 6 7 ll sum[10]; 8 char s[12]; 9 10 void init()11 {12 for(int i=1 ; i<=9 ; i++){13 ll tmp = 1;14 for(int j=26 ; j>26-i ; j--)15 tmp *= j;16 for(int j=1 ; j<=i ;j++)17 tmp /= j;18 sum[i] = sum[i-1] + tmp;19 }20 }21 22 bool ok(int len)23 {24 for(int i=1 ; i<len ; i++){25 if(s[i] - s[i-1] <= 0) return false;26 }27 return true;28 }29 30 ll C(int n , int m)31 {32 ll ans = 1;33 for(int i=n ; i>n-m ; i--)34 ans *= i;35 for(int i=1 ; i<=m ; i++)36 ans /= i;37 return ans;38 }39 40 int main()41 {42 // freopen("a.in" , "r" , stdin);43 init();44 while(scanf("%s" , s) != EOF)45 {46 int len = strlen(s);47 48 if(!ok(len)){49 puts("0");50 continue;51 }52 53 ll ans = sum[len-1];54 for(int i=0 ; i<len ; i++){55 if(i == 0){56 for(int j=1 ; j<(int)(s[i]-‘a‘+1) ; j++){57 ans += C(26-j , len-1-i);58 }59 }60 else{61 for(int j=(int)(s[i-1]-‘a‘+2) ; j<(int)(s[i]-‘a‘+1) ; j++){62 ans += C(26-j , len-1-i);63 }64 }65 }66 ans ++;67 printf("%I64d\n" , ans);68 }69 return 0;70 }
POJ 1850
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。