[bzoj1072][SCOI2007]排列(状态压缩DP)
2014-09-14 11:55
288 查看
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1072
分析:看了题解才知道,状态的设计很巧妙,用余数表示,即f[i][j]表示二进制状态i下余数为j的方案数,然后列一列式子就可以了,注意排除相同数字的情况。
View Code
分析:看了题解才知道,状态的设计很巧妙,用余数表示,即f[i][j]表示二进制状态i下余数为j的方案数,然后列一列式子就可以了,注意排除相同数字的情况。
#include<cstring> #include<algorithm> #include<cstdio> #include<string> using namespace std; const int maxn=1024; int f[maxn+50][1000]; char s[15]; int t,d; int main() { scanf("%d\n",&t); while(t) { --t; scanf("%s%d\n",s,&d); int n=strlen(s); memset(f,0,sizeof(f)); int m=(1<<n) - 1; for(int i=0;i<n;++i) f[1<<i][(s[i]-48)%d]=1; for(int i=1;i<=m;++i) for(int j=0;j<n;++j) if((i&(1<<j))!= 0 && i-(1<<j)>=0) for(int k=0;k<d;++k) f[i][(10*k+(s[j]-48))%d]+=f[i-(1<<j)][k]; for(int i=0;i<=9;++i) { int ans=0; for(int j=0;j<n;++j) if(s[j]-48==i) ++ans; int c=1; for(int j=2;j<=ans;++j) c*=j; f[m][0]/=c; } printf("%d\n",f[m][0]); } return 0; }
View Code
相关文章推荐
- BZOJ 1072: [SCOI2007]排列perm 状态压缩DP
- BZOJ 1072 [SCOI2007]排列perm (状态压缩+dp+同余定理)
- [bzoj1072][SCOI2007][排列perm] (状态压缩+数位dp+排列去重)
- [BZOJ1072]-[SCOI2007]排列perm-状压DP
- bzoj1072 [SCOI2007]排列perm(状压dp)
- [BZOJ1072] [SCOI2007] 排列perm - dfs/dp
- [SCOI2007] BZOJ 1072 排列perm - 状压dp
- [BZOJ1072][SCOI2007]排列perm(状压dp)
- bzoj1072: [SCOI2007]排列perm 压状dp
- bzoj 1072: [SCOI2007]排列perm(状压DP)
- BZOJ 1072: [SCOI2007]排列perm [DP 状压 排列组合]
- bzoj 1072: [SCOI2007]排列perm(状压dp)
- [BZOJ1072][SCOI2007]排列perm(状压DP)
- BZOJ_P1072 [SCOI2007]排列perm(状态压缩动态规划)
- [BZOJ1072]SCOI2007排列|DP
- bzoj 1072: [SCOI2007]排列perm 状压dp
- BZOJ 1072 [SCOI2007]排列perm 状压DP
- BZOJ 1072 [SCOI2007]排列perm ——状压DP
- BZOJ1072: [SCOI2007]排列perm 状压DP
- BZOJ 1072 [SCOI 2007] 排列perm (状压DP)