POJ 1850

时间:2023-03-09 18:32:53
POJ 1850
 #include <iostream>
#include <string>
using namespace std; int fac(int num); int C(int n,int m);
int com( int n, int k );
int main()
{
//freopen("acm.acm","r",stdin);
string s;
int sum;
int j;
int i;
// cout<<com(4,2)<<endl; while(cin>>s)
{
sum = ;
for(i = ; i < s.length()-; ++ i)//把前面的都加起来,看看这个字符串len-1个长度的+len-2····1的字符串一共有多少个
{
sum += com(,i+);
}
// cout<<s<<endl;
// cout<<"sum "<<sum<<endl; //cout<<"len "<<s.length()<<endl;
for(i = ; i < s.length(); ++ i)
{
for(j = i+; j < s.length(); ++ j)
{
if(s[i] >= s[j])
{
break;
}
}
if(j != s.length()) //
{
break;
}
}
if(i != s.length()) //如果字符串不是按照升序排列的,那么要输出0;
{
cout<<<<endl;
continue;
}
for(i = ; i < s.length(); ++ i) //看看当前的字符串在“本长度”中排在什么样的位置。
{
if(i == )
{
j = ;
}
else
{
j = s[i-]-'a'+;
}
for(; j < s[i]-'a'; ++ j) //现在依然是在计算 与当前字符串一样长度的字符串的数量(之前的 ~ )
{
sum += com(-j-,s.length()-i-);//这个组合是固定开头的字符,选取后面的!
}//计算的过程是比如说第一个位置是k,开始固定'a'那么以后的len-1个位置上就是从b~z中选出组合,然后再固定b再选,……
//直到第一个位置是k本身,第一个位置枚举完了,枚举地二个位置,从a开始直到第二个位置的字符本身,依次类推,直到最后一个字符枚举完毕,本 //字符串之前的就算计算完了 因为这样枚举都是本字符串之前 //的了~
}
cout<<sum+<<endl; }
} int C(int n,int m)
{
return fac(n)/(fac(m)*fac(n-m));
} int fac(int num)
{
int i;
int sum = ;
for(i = ; i <= num; ++ i)
{
sum *= i;
}
return sum;
} int com( int n, int k ) //如果用常规的 以前的很笨的方法,会造成大数的溢出
{ if ( k> )
{
return com(n-, k- ) * n / k;//组合公式
}
return ;
}

关注我的公众号,当然,如果你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。

POJ 1850

技术网站地址: vmfor.com