3 条题解

  • 1
    @ 2025-10-6 14:11:45
    #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
      @ 2025-10-31 20:20:42
      #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
        @ 2025-10-6 13:44:53

        使用康托展开来解,讨论里有解释

        #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
        上传者