3 条题解
-
1
#include<stdio.h> #include<string.h> long long int a[20]; void jiecheng(){//预处理1到12的阶乘然后存下 a[0]=1; for(int i=1;i<=12;i++){ a[i]=a[i-1]*i; } } int main() { int n,l; scanf("%d",&n); jiecheng();//预处理 char m[20]; while(n--){ scanf("%s",m); l=strlen(m); long long int sum=0; for(int i=0;i<l;i++){ int num=0; for(int j=i+1;j<l;j++){ if(m[j]<m[i]){ num++; } }sum+=num*a[l-i-1];//康托展开,可以看看讨论里有详解 }printf("%lld\n",sum+1);//康托展开从0名开始计数,题目从1开始 } return 0; } -
0
#include <stdio.h> #include <string.h> int main() { long long fact[13] = {1}; // 阶乘数组,fact[i]为i的阶乘 for (int i = 1; i <= 12; i++) { fact[i] = fact[i - 1] * i; } int n; scanf("%d", &n); char s[13]; // 存储12个字符的排列(含'\0') while (n--) { scanf("%s", s); int a[12] = {0}; // 初始化(a~l对应索引0~11) long long b = 0; for (int i = 0; i < 12; i++) { int c = s[i] - 'a'; // 减去a的Ascll码值 int cnt = 0; // 统计当前字符前未使用且更小的字符数量 for (int j = 0; j < c; j++) { if (a[j]==0) cnt++; } b += cnt * fact[11 - i]; a[c] = 1; // 标记当前字符为已使用 } printf("%lld\n", b + 1); // 排列位置从1开始,故+1 } } -
0
使用康托展开来解,讨论里有解释
#include<stdio.h>
int main(){
int n,x;
char a[13];
scanf("%d",&n);
while(n--){
long long sum=0;
scanf("%s",a);
for(int i=0;i<12;i++){
x=0;
long long b=1;
for(int j=i+1;j<12;j++){
if(a[i]>a[j]){
x++;}
}
for(int z=1;z<=12-i-1;z++){
b=b*z;
}
sum=sum+x*b;
}
printf("%lld\n",sum+1);
}
return 0;
}
- 1
信息
- ID
- 174
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 243
- 已通过
- 124
- 上传者