zoukankan      html  css  js  c++  java
  • [bzoj1072] [SCOI2007]排列perm

    有一种暴力算法就是直接枚举。
    正解就是状压dp
    令f[i][j]:i:使用的数位的状态j:当前的模数
    边界:f[0][0] = 1;
    f[i|1<<k][j*10+k % n] += f[i][j] | !(i&(1<<k))
    答案就是f[i<<len-1][0]
    进行了一些重复处理。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 15;
    int main() {
      //  freopen("input", "r", stdin);
      int T;
      scanf("%d", &T);
      while (T--) {
        int f[1024 + 5][1000 + 10];
        char s[maxn];
        int n;
        long long Ans;
        scanf("%s %d", s, &n);
        int a[maxn], Cnt[maxn];
        int len = strlen(s);
        f[0][0] = 1;
        for (int i = 0; i < len; i++) {
          a[i] = s[i] - '0';
          ++Cnt[a[i]];
        }
        for (int i = 0; i < 1 << len; i++) {
          for (int j = 0; j < len; j++) {
            for (int k = 0; k < len; k++) {
              if (!(i & 1 << k)) {
                f[i | (1 << k)][(j * 10 + k) % n] += f[i][j];
              }
            }
          }
        }
        Ans = f[(1 << len) - 1][0];
        for (int i = 0; i <= 9; i++) {
          for (int j = 1; j <= Cnt[i]; j++) {
            Ans /= j;
          }
        }
        printf("%lld
    ", Ans);
        /*  char s[maxn];
          int n;
          scanf("%s %d", s, &n);
          int a[maxn];
          int len = strlen(s);
          for (int i = 0; i < len; i++)
            a[i] = s[i] - '0';
          sort(a, a + len);
          set<long long> st;
          st.clear();
          int ans = 0;
          while (1) {
            long long num = 0;
            for (int j = 0; j < len; j++)
              num = num * 10 + a[j];
            if (st.count(num))
              continue;
            else if (!(num % n)) {
              st.insert(num);
              ans++;
            }
            if (!next_permutation(a, a + len))
              break;
          }
          printf("%d
    ", ans);*/
      }
      return 0;
    }
    
    
  • 相关阅读:
    洛谷 U141580 简化罗波切问题
    洛谷 U141578 维修电路
    洛谷 U140760 狭义公因子
    CF75C Modified GCD
    算法题-求解斐波那切数列的第N个数是几?
    算法题-求N的阶乘
    JAVA8新特性
    nginx启动脚本,手动编辑
    javah生成带有包名的头文件
    Matlab图像处理(03)-基本概念
  • 原文地址:https://www.cnblogs.com/gengchen/p/6223258.html
Copyright © 2011-2022 走看看