2 条题解

  • 0
    @ 2025-10-8 17:06:25

    by qkw:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    LL sum[20], a[110], b[1010], c[1010];
    char st[60];
    // sum为剩余的未排列的各个数字的个数 
    LL cc()//计算排列剩余数字的方法数 
    {
        //剩下的部分比较板 
        LL len = 0;
        for(int i = 0; i <= 9; i++)
            for(int j = 1; j <= sum[i]; j++)
                b[++len] = len, c[len] = j;
        for(int i = 1; i <= len; i++)
            for(int j = 1; j <= len; j++)
            {
                LL d = __gcd(b[i], c[j]);
                b[i] /= d, c[j] /= d;
            }
        LL ans = 1;
        for(int i = 1; i <= len; i++)
            ans *= b[i];
        return ans;
    }
    LL dfs(int x)
    {
        if(x == 0)
            return 0;
        LL ans = 0;
        for(int i = 0; i < a[x]; i++)
            if(sum[i])//一定要有这个数才能执行操作 
            {
                sum[i]--;//将当前位设置为i 
                ans += cc();//计算排列数 
                sum[i]++;//还原 
            }
        sum[a[x]]--;
        ans += dfs(x - 1);//计算下一位 
        sum[a[x]]++;
        return ans;
    }
    LL calc(int len)
    {
        for(int i = 1; i <= len; i++)
            sum[a[i]]++;
        return dfs(len);
    }
    int main()
    {
        scanf("%s", st + 1);
        int len = strlen(st + 1);//输入有亿点点长,记得用字符串 
        for(int i = 1; i <= len; i++)
            a[len + 1 - i] = st[i] - 48;
        printf("%lld\n", calc(len));
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:06:07

      by qkw:

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      LL sum[20],a[110],b[1010],c[1010];char st[60];
      //sum为剩余的未排列的各个数字的个数 
      LL cc()//计算排列剩余数字的方法数 
      {
      	//剩下的部分比较板 
          LL len=0;
          for(int i=0;i<=9;i++)for(int j=1;j<=sum[i];j++)b[++len]=len,c[len]=j;
          for(int i=1;i<=len;i++)for(int j=1;j<=len;j++)
          {
              LL d=__gcd(b[i],c[j]);
              b[i]/=d,c[j]/=d;
          }
          LL ans=1;for(int i=1;i<=len;i++)ans*=b[i];
          return ans;
      }
      LL dfs(int x)
      {
          if(x==0)return 0;
          LL ans=0;
          for(int i=0;i<a[x];i++)if(sum[i])//一定要有这个数才能执行操作 
          {
              sum[i]--;//将当前位设置为i 
              ans+=cc();//计算排列数 
              sum[i]++;//还原 
          }
          sum[a[x]]--;
          ans+=dfs(x-1);//计算下一位 
          sum[a[x]]++;
          return ans;
      }
      LL calc(int len)
      {
          for(int i=1;i<=len;i++)sum[a[i]]++;
          return dfs(len);
      }
      int main()
      {
          scanf("%s",st+1);int len=strlen(st+1);//输入有亿点点长,记得用字符串 
          for(int i=1;i<=len;i++)a[len+1-i]=st[i]-48;
          printf("%lld\n",calc(len));
          return 0;
      }
      • 1

      信息

      ID
      4090
      时间
      1000ms
      内存
      512MiB
      难度
      8
      标签
      递交数
      94
      已通过
      12
      上传者