首页 > 其他 > 详细

bzoj1072: [SCOI2007]排列perm

时间:2016-06-08 20:17:07      阅读:161      评论:0      收藏:0      [点我收藏+]

状压dp。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 12;

int f[1<<maxn][1010],cnt[maxn],fac[maxn];
char s[maxn];
int T,d,N,n;

int main() {
    fac[0]=1;
    for(int i=1;i<=10;i++) fac[i]=fac[i-1]*i;
    scanf("%d",&T);
    while(T--) {
        memset(cnt,0,sizeof(cnt));
        scanf("%s%d",s,&d);
        n=strlen(s);
        N=(1<<n)-1;
        for(int i=0;i<n;i++) cnt[s[i]-0]++;
        
        memset(f,0,sizeof(f));
        f[0][0]=1;
        for(int i=0;i<N;i++)
        for(int j=0;j<d;j++) 
            if(f[i][j]) 
            for(int k=0;k<n;k++) if(!((1<<k)&i))
                f[i|(1<<k)][(j*10+(s[k]-0))%d]+=f[i][j];
        int res=f[N][0];
        for(int i=0;i<10;i++) res/=fac[cnt[i]];
        printf("%d\n",res);
    }
    return 0;
}

bzoj1072: [SCOI2007]排列perm

原文:http://www.cnblogs.com/invoid/p/5571207.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!