首页 > 其他 > 详细

[bzoj1072]排列

时间:2019-11-04 16:24:29      阅读:87      评论:0      收藏:0      [点我收藏+]

考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int t,d,n,tot[15],f[2005][1005];
 4 char s[15];
 5 int main(){
 6     scanf("%d",&t);
 7     while (t--){
 8         scanf("%s%d",s,&d);
 9         n=strlen(s);
10         memset(tot,0,sizeof(tot));
11         for(int i=0;s[i];i++)tot[s[i]-0]++;
12         memset(f,0,sizeof(f));
13         f[0][0]=1;
14         for(int i=0;i<(1<<n);i++)
15             for(int j=0;j<n;j++)
16                 if (!(i&(1<<j)))
17                     for(int k=0;k<d;k++){
18                         int kk=(k*10+s[j]-0)%d;
19                         f[i+(1<<j)][kk]=f[i+(1<<j)][kk]+f[i][k];
20                     }
21         for(int i=0;i<10;i++)
22             for(int j=1;j<=tot[i];j++)f[(1<<n)-1][0]/=j;
23         printf("%d\n",f[(1<<n)-1][0]);
24     }
25 }
View Code

 

[bzoj1072]排列

原文:https://www.cnblogs.com/PYWBKTDA/p/11792639.html

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