Wrong Word
题目描述
有一个长度
且只包含大写字母的单词。我们在写作时不小心把它写错了,写错的单词与正确的单词中每种字母的个数相同,那么有多少种不同的写错的单词呢?
输入描述:
输入一行字符串,长度
且只包含大写字母
输出描述:
输出一个整数,即答案
示例3
输出
复制359
组合数学中常用结论:不全相异元素的全排列。这里有k种字母,第i种有a[i]个,总共N个。它们能排列出多少个单词?
答案是: 这很好证明,做全排列有N!种可能,但有a[1]个相同的,这a[1]个不考虑次序,除以a[1]!,等等。答案就是这个不全相异的全排列数-1
1 // 2 // Created by w on 2020/11/28. 3 // 4 5 #include<bits/stdc++.h> 6 using namespace std; 7 typedef long long ll; 8 ll n,m[11],k[200]; 9 string s; 10 int main() 11 { 12 m[0]=1; 13 for(int i=1;i<=10;i++) 14 {//计算阶乘,数据范围小直接读出阶乘即可 15 m[i]=i*m[i-1]; 16 } 17 cin>>s; 18 n=s.size(); 19 ll ans=m[n];//保存n! 20 for(int i=0;i<n;i++) 21 k[s[i]]++;//桶排序,记录不同字母个数 22 for(int i='A';i<='Z';i++){ 23 ans/=m[k[i]];//除以相同的字母的阶乘 24 } 25 cout<<ans-1<<'\n'; 26 }

浙公网安备 33010602011771号