传送门

解题思路

首先我们发现这道题s的长度很小,所以考虑点暴力的做法,状压dp或搜索。本蒟蒻搜索永远调不对,所以就写了个状压dp。因为所有s里的数都要出现一次,并且最后的答案是要求整除,那么我们设dp[S][k]表示现在所选的状态集合为S,当前所选的数组成的数字对d取余后的值为k,这样就可以转移了。首先枚举所有的状态S,然后再枚举所有没有被选的数j,再枚举余数k即可转移。 转移方程为:dp[S|(1<<(j-1))][(k*10+a[j])%d]+=dp[S][k];但是这样写是错误的,因为没有考虑重复的排列,比如说s为"001",结果发现“010”这个状态会被算两次。。看到有大佬直接用数学方法去重orz,本蒟蒻不太会,就记了个临时数组b[i],表示当前要填的数字i有没有被填过,这样就可以避免一个位置放相同元素的情况了,具体看代码。时间复杂度为O(T*len*d*(2^len))

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std;
const int MAXN = ; int T,d,a[MAXN],cnt,dp[<<MAXN][];
bool b[MAXN];
char s[MAXN]; int main(){
scanf("%d",&T);int len;
while(T--){
memset(dp,,sizeof(dp));
scanf("%s%d",s+,&d);
len=strlen(s+);cnt=;
for(register int i=;i<=len;i++) a[i]=s[i]-'';
dp[][]=;
for(register int S=;S<(<<len)-;S++){
memset(b,,sizeof(b));
for(register int j=;j<=len;j++)if(!(S&(<<(j-))) && !b[a[j]]){
b[a[j]]=;
for(register int k=;k<d;k++)
dp[S|(<<(j-))][(k*+a[j])%d]+=dp[S][k];
}
}
printf("%d\n",dp[(<<len)-][]);
}
return ;
}

LUOGU P4163 [SCOI2007]排列的更多相关文章

  1. P4163 [SCOI2007]排列——next_permutation

    P4163 [SCOI2007]排列 注意要排序: next_permutation prev_permutation #include<cstdio> #include<cstri ...

  2. 暑假集训Day 4 P4163 [SCOI2007]排列 (状压dp)

    状压dp (看到s的长度不超过10就很容易想到是状压dp了 但是这个题的状态转移方程比较特殊) 题目大意 给一个数字串 s 和正整数 d, 统计 s 有多少种不同的排列能被 d 整除(可以有前导 0) ...

  3. BZOJ 1072: [SCOI2007]排列perm 状态压缩DP

    1072: [SCOI2007]排列perm Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为 ...

  4. SCOI2007排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 805  Solved: 497[Submit][Stat ...

  5. BZOJ 1072 [SCOI2007]排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1268  Solved: 782[Submit][Sta ...

  6. [BZOJ1072][SCOI2007]排列perm 状压dp

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2488  Solved: 1546[Submit][St ...

  7. [BZOJ1072][SCOI2007] 排列prem

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...

  8. 1072: [SCOI2007]排列perm - BZOJ

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种.Input ...

  9. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

随机推荐

  1. ASP.NET Core Web应用在发布时选择是否对视图进行编译

    原文:ASP.NET Core Web应用在发布时选择是否对视图进行编译 在我们发布ASP.NET Core Web应用程序时,选择以文件形式发布,发布方法选择文件系统 默认情况下,会把Views的视 ...

  2. Java超简明入门学习笔记(一)

    Java编程思想第4版学习笔记(一) 第二章 一切都是对象(Hello World)          这个笔记本主要记录了我在学习Java编程思想(第4版,中文版)的过程中遇到的重难点及其分析.主要 ...

  3. CSV导入到hive中,处理分号问题

    1.导入的原数据 103744;545479945;2017.05.17 06:41:08;sell;eurusd_;0.10;1.11080;1.11280;1.10880;1.11081;0.00 ...

  4. RDD运行原理

  5. java内存模型和垃圾回收

    摘抄并用于自查 JVM内存模型 1. Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文 ...

  6. PL SQL 12.0.7的安装及注册码,汉化包,连接Oracle远程数据库,中文乱码问题处理

    首先,在官网下载PL SQL 的对应版本,本机是64位的就下载64位的,网址:https://www.allroundautomations.com/downloads.html#PLS 点击应用程序 ...

  7. Python学习笔记(六)——类和对象

    1.self的用法 全面理解self 2. 继承 子类继承父类,自动拥有父类的全部方法 >>> class Animal: def run(self): print('Animal ...

  8. JS随机产生颜色

    <script> function selectForm(lowerValue,upperValue){ var choices=upperValue-lowerValue+1; retu ...

  9. Python: 生成器与迭代 generators and iteration

    https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/ 文章不是非常好 1,三个概念 可迭代对象 iterable, 迭代器 i ...

  10. springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发

    工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...