\(\\\)

\(Description\)


给出只包括多个\(0\text~ 9\)的数字集,求有多少个本质不同的全排列,使得组成的数字能够整除\(M\)。

  • \(|S|\in [1,10]\),\(M\in [1,10^3]\)

\(\\\)

\(Solution\)


  • 一眼状压,先将所有数字看作互不相同,\(f[S][k]\)表示集合内数字选取情况为\(S\),当前组成的数对\(M\)取模的结果为\(k\)的方案数,显然边界\(f[0][0]=1\)。
  • 枚举补集里的元素扩展,每次注意余数改为\((k*10+a[j])\%M\)。
  • 注意到每一个答案最后都用到了所有的数,所以所有相同的数最后在每一个答案里都会出现全排列,也就是说答案为\(f[S_{max}][0]\)除掉每一个数的全排列后的答案。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1050
#define R register
#define gc getchar
using namespace std; int n,m,t,tot,a[10],p[10],num[10],f[N][N]; int main(){
scanf("%d",&t);
while(t--){
char c=gc(); m=0;
for(R int i=0;i<=9;++i) p[i]=1,num[i]=0;
while(!isdigit(c)) c=gc();
a[tot=1]=c^48; ++num[a[1]];
while(isdigit(c=gc())) ++num[a[++tot]=c^48];
for(R int i=0;i<=9;++i)
for(R int j=1;j<=num[i];++j) p[i]*=j;
while(!isdigit(c)) c=gc();
while(isdigit(c)){
m=(m<<1)+(m<<3)+(c^48); c=gc();
}
for(R int i=0;i<(1<<tot);++i)
for(R int j=0;j<m;++j) f[i][j]=0;
f[0][0]=1;
for(R int i=0;i<(1<<tot);++i)
for(R int j=0;j<m;++j) if(f[i][j]){
for(R int k=0;k<tot;++k)
if(!(i&(1<<k))) f[i|(1<<k)][(j*10+a[k+1])%m]+=f[i][j];
}
for(R int i=0;i<=9;++i) f[(1<<tot)-1][0]/=p[i];
printf("%d\n",f[(1<<tot)-1][0]);
}
return 0;
}

[ SCOI 2007 ] Perm的更多相关文章

  1. 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳

    因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...

  2. 图论(网络流):SCOI 2007 修车

    同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小 ...

  3. 解题:SCOI 2007 蜥蜴

    题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...

  4. [SCOI 2007] 修车

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1070 [算法] 首先 , 我们发现 , 在倒数第i个修车会对答案产生i * k的贡献 ...

  5. 【SCOI 2007】 降雨量

    [题目链接] 点击打开链接 [算法] 线段树 此题细节很多,写程序时要细心! [代码] #include<bits/stdc++.h> using namespace std; #defi ...

  6. [SCOI 2007] 排列

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1072 [算法] 状压DP [代码] #include<bits/stdc++. ...

  7. poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

    /** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...

  8. BZOJ 2007: [Noi2010]海拔

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2410  Solved: 1142[Submit][Status] ...

  9. 开源WinForms界面开发框架Management Studio 选项卡文档 插件 Office 2007蓝色风格 后台线程

    Management Studio是我在WinForms小项目开发过程中搭建起来的一个插件式结构的应用程序框架,因为简单灵活又容易扩展,现在将它开源供读者参考. 跑起来的效果图如下所示,具备选项卡式多 ...

随机推荐

  1. noip模拟赛 花

    [问题描述]商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...

  2. 采药 2005年NOIP全国联赛普及组&疯狂的采药

     时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望 ...

  3. 2.1 shuffle sort(洗牌)

    1.目的:将数组以随机的顺序重新排序,类似洗牌的过程 2.用途用于快速排序或者任何以划分为基础的排序中,目的是减少最坏可能性发生的概率. 3.想法1:给数组的每一个元素产生一个随机的数字作为键,然后使 ...

  4. 放大的X

    Problem Description 请你编程画一个放大的’X’.如3*3的’X’应如下所示: X X XX X 5*5的’X’如下所示:X X X X X X XX X   Input 输入数据第 ...

  5. rest frame work纪念版代码

    models.py from django.db import models from pygments.lexers import get_all_lexers from pygments.styl ...

  6. BZOJ(8) 1053: [HAOI2007]反素数ant

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4118  Solved: 2453[Submit][St ...

  7. Linux自己主动挂载第二块硬盘分区

    改动/etc/fstab文件,如果挂载到/data文件夹.在最后一行加上 /dev/sdb1 /data ext4 defaults 1 1 最后结果例如以下: # # /etc/fstab # Cr ...

  8. ExtJs--09--javascript对象的方法的3种写法 prototype通过原型设置方法效率最好

    /** * javascript对象的方法的3种写法 推荐第三种 运行效率最好 */ function P(name , age){ this.name = name ; this.age = age ...

  9. 中文在C/C++中的处理和汉字乱码问题(wchar_t)

    中文字在C/C++中的处理 现在编程的语言和编程环境随着中国的发展開始对中文有进一步的支持.可是对中文的支持整体来说是有缺陷的,并且有与编译环境的不同导致中文在当前的C/C++中有非常多问题,并且非常 ...

  10. about service in android

    注意:标红处! A Service is an application component representing either an application's desire to perform ...