2 条题解

  • 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-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
      标签
      (无)
      递交数
      234
      已通过
      117
      上传者