zoukankan      html  css  js  c++  java
  • bzoj1072

    题意:

    给你一个数n

    问把这个数的各个数位重新排列,问

    有多少种排列被d整除

    题解:

    状压dp

    f[i][j]表示在i状态下%d=j

    然后转移

    最后不要忘记组合数

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2005;
    int T,d,len,a[N],v[N],tot[N],f[N][N];
    char ch[N];
    int main()
    {
        scanf("%d",&T);
        while (T--)
         {
             scanf("%s",ch);
            scanf("%d",&d);
            len=strlen(ch);
            for (int i=0;i<=9;i++)v[i]=1,tot[i]=0;
            for (int i=0;i<len;i++)
             {
                a[i]=ch[i]-'0';
                tot[a[i]]++;
                v[a[i]]*=tot[a[i]];
             }
            memset(f,0,sizeof f);    
            f[0][0]=1;
            for (int i=0;i<1<<len;i++)
             for (int k=0;k<d;k++)
              if (f[i][k])
               for (int x=0;x<len;x++)
                if(((1<<x)&i)==0)
                 f[i|(1<<x)][(a[x]+k*10)%d]+=f[i][k];
            for (int i=0;i<=9;i++)f[(1<<len)-1][0]/=v[i];
            printf("%d
    ",f[(1<<len)-1][0]);
         }
        return 0;
    }
  • 相关阅读:
    12月4日
    12月3日
    12月2日
    12月1日
    11月30日
    11月29日
    11月28日
    11月27日
    jquery mobile-按钮控件
    ap web
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8451442.html
Copyright © 2011-2022 走看看