[SCOI 2007] 排列
Posted evenbao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SCOI 2007] 排列相关的知识,希望对你有一定的参考价值。
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=1072
[算法]
状压DP
[代码]
#include<bits/stdc++.h> using namespace std; #define MAXD 1000 const int MAXS = 2048; int i,j,k,T,len,d,MASK; char s[20]; long long f[MAXS][MAXD]; long long ans; long long fac[15]; int cnt[10]; int main() { fac[0] = 1; for (i = 1; i <= 10; i++) fac[i] = fac[i-1] * i; scanf("%d",&T); while (T--) { scanf("%s%d",&s,&d); len = strlen(s); MASK = (1 << len) - 1; memset(f,0,sizeof(f)); memset(cnt,0,sizeof(cnt)); for (i = 0; i < len; i++) cnt[s[i] - ‘0‘]++; f[0][0] = 1; for (i = 0; i <= MASK; i++) { for (j = 0; j < d; j++) { for (k = 0; k < len; k++) { if ((i & (1 << k)) == 0) f[i | (1 << k)][(j * 10 + s[k] - ‘0‘) % d] += f[i][j]; } } } ans = f[MASK][0]; for (i = 0; i < 10; i++) ans /= fac[cnt[i]]; printf("%lld ",ans); } return 0; }
以上是关于[SCOI 2007] 排列的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ1072: [SCOI2007]排列perm 状压DP