bzoj1072[SCOI2007]排列perm
2017-09-12 20:53
423 查看
题目大意:
给定n个数字,求这些数字组成的不重复的全排列中有多少整除d
暴力:用next_permutation+set判重暴力判断(据说是可以过的)大常数选手又T掉了
状压:
对于这种整除问题的题目很明显可以想到用余数设定状态orz
fi,ji表示集合中选的情况,j代表此时的余数,f为方案数
方程就很容易得出了
PS:注意:答案计算会重复,用排列的公式去重
给定n个数字,求这些数字组成的不重复的全排列中有多少整除d
暴力:用next_permutation+set判重暴力判断(据说是可以过的)大常数选手又T掉了
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<set> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; int T,d,vis[20]; typedef long long ll; char ch[20]; int num[20]; ll fac(int x){if(x==0)return 1;ll ans=1;for(int i=x;i>=1;i--)ans*=i;return ans;} ll cal(int *tmp,int L){int ans=1;for(int i=1;i<=L;i++)ans+=(pow(10,L-i)*tmp[i]);return ans-1;} int main() { scanf("%d",&T); while(T--) { scanf("%s%d",ch+1,&d); int len=strlen(ch+1); for(int i=1;i<=len;i++)num[i]=ch[i]-'0'; sort(num+1,num+1+len); ll tot=0; set<ll>s; if(cal(num,len)%d==0)tot++; while(next_permutation(num+1,num+1+len)){ if(!s.count(cal(num,len))&&cal(num,len)%d==0)tot++,s.insert(cal(num,len)); } printf("%lld\n",tot); } return 0; }
状压:
对于这种整除问题的题目很明显可以想到用余数设定状态orz
fi,ji表示集合中选的情况,j代表此时的余数,f为方案数
方程就很容易得出了
PS:注意:答案计算会重复,用排列的公式去重
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1<<10; typedef long long ll; ll f ; int T,d,len,num[20],cnt[20],v ;char ch[20]; int main() { scanf("%d",&T); while(T--) { memset(f,0,sizeof(f));f[0][0]=1; memset(cnt,0,sizeof(cnt)); scanf("%s%d",ch+1,&d); len=strlen(ch+1); fo(i,1,len)num[i]=ch[i]-'0'; fo(i,0,9)v[i]=1; fo(i,1,len)cnt[num[i]]++,v[num[i]]*=cnt[num[i]]; for(< 4000 span class="hljs-keyword">int i=0;i<(1<<(len));i++) for(int j=0;j<d;j++) if(f[i][j]) for(int k=1;k<=len;k++) if(!((1<<(k-1))&i)) f[i|(1<<(k-1))][((10*j)+num[k])%d]+=f[i][j]; fo(i,0,9)f[(1<<len)-1][0]/=v[i]; printf("%lld\n",f[(1<<len)-1][0]); } return 0; }
相关文章推荐
- BZOJ 1072 [SCOI 2007] 排列perm (状压DP)
- bzoj1072 [SCOI2007]排列perm
- [BZOJ]1072: [SCOI2007]排列perm
- bzoj 1072: [SCOI2007]排列perm【状压dp】
- [bzoj1072][SCOI2007]排列perm
- BZOJ 1072 [SCOI2007]排列perm 状压DP
- [SCOI2007] BZOJ 1072 排列perm - 状压dp
- bzoj1072: [SCOI2007]排列perm
- BZOJ 1072: [SCOI2007]排列perm 状压dp
- [BZOJ1072]-[SCOI2007]排列perm-状压DP
- [BZOJ1072][SCOI2007]排列perm
- 【SCOI2007】【BZOJ1072】排列perm
- bzoj1072 [SCOI2007]排列perm(状压dp+组合数学)
- 【BZOJ】1072: [SCOI2007]排列perm(状压dp+特殊的技巧)
- 【枚举】bzoj1072 [SCOI2007]排列perm
- bzoj:1072: [SCOI2007]排列perm
- [BZOJ1072][SCOI2007]排列perm(状压DP)
- 【BZOJ】【1072】【SCOI2007】排列perm
- [BZOJ1072] [SCOI2007] 排列perm - dfs/dp
- bzoj1072: [SCOI2007]排列perm 压状dp