强烈谴责只有 125MB 的行为,然后我没删调试是个什么 SB。。。

闲话少说,切入正题——


首先看到取余和数字是可以排列的,我们自然而然的想到了数位 dp,但是很显然这题不是的数位 dp 通常解决的是 \(1\sim k\) 之间符合要求的数这里是恰好符合的。

发现 \(s\) 长度很小,只有 \(15\),所以考虑状压。

然后这个时候 SX 还没看出来是状压足以见得他是个瞎子了!

如果数据范围很小还是个 dp 一定要考虑状压!!!!!

如果数据范围很小还是个 dp 一定要考虑状压!!!!!

也就 SX 这种带聪明想不到状压了吧/qd


然后就很显然要记录余数,设 \(f_{i, S}\) 为选择状态为 \(S\) 余数为 \(i\) 的方案数。

如果我们要加入一个数字,首先他要不在 \(S\) 内(一直没判这个调了很长时间,所以我是压根不会状压石锤,这种弱智玩意儿都没看出来),然后转移很显然 \(f_{(10i + a_j)\bmod d, S|(1<<j)} += f_{i, S}\)。

重复数字除以它出现次数阶乘即可。

代码:

//SIXIANG
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#define MAXN 1000
#define int long long
#define QWQ cout << "QWQ" << endl;
using namespace std;
int f[MAXN + 10][(1 << 10) + 10], arr[10], t[10], frac[16];
void pre() {
frac[0] = 1;
for(int p = 1; p <= 16; p++) frac[p] = frac[p - 1] * p;
}
signed main() {
pre();
int T; cin >> T;
string str; int d;
while(T--) {
cin >> str >> d;
memset(t, 0, sizeof(t));
memset(arr, 0, sizeof(arr));
memset(f, 0, sizeof(f));
int i = 0;
for(int p = 0; p < str.size(); p++)
t[str[p] - '0']++, arr[p] = str[p] - '0'; f[0][0] = 1;
int len = str.size();
for(int S = 0; S < (1 << len); S++)
for(int p = 0; p < len; p++)
for(int i = 0; i < d; i++)
if(!((S >> p) & 1))
f[(10 * i + arr[p]) % d][S | (1 << p)] += f[i][S];
for(int p = 0; p <= 9; p++)
f[0][(1 << len) - 1] /= frac[t[p]]; cout << f[0][(1 << len) - 1] << endl;
}
}

顺便提一嘴,这里面枚举 S 要放在外层循环。因为显然余数一维不可能作为阶段。

以及 500ms 确实有点卡。

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

  1. P4163 [SCOI2007]排列——next_permutation

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

  2. LUOGU P4163 [SCOI2007]排列

    传送门 解题思路 首先我们发现这道题s的长度很小,所以考虑点暴力的做法,状压dp或搜索.本蒟蒻搜索永远调不对,所以就写了个状压dp.因为所有s里的数都要出现一次,并且最后的答案是要求整除,那么我们设d ...

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

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

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

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

  5. SCOI2007排列perm

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

  6. BZOJ 1072 [SCOI2007]排列perm

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

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

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

  8. [BZOJ1072][SCOI2007] 排列prem

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

  9. 【BZOJ】1072: [SCOI2007]排列perm(状压dp+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1072 首先无限膜拜题解orz表示只会暴力orz 数据那么小我竟然想不到状压! orz 这种题可以取模 ...

  10. 【62.89%】【BZOJ 1072】[SCOI2007]排列perm

    Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1862  Solved: 1171 [Submit][Status][Discuss] Descri ...

随机推荐

  1. [Kogel.Subscribe.Mssql]SQL Server增量订阅,数据库变更监听

    此框架是SQL Server增量订阅,用来监听增删改数据库数据变更 目前仅支持SQL Server,Nuget上可以下载安装 或者使用Nuget命令添加包 dotnet add package Kog ...

  2. Windows 10 读取bitlocker加密的硬盘出现参数错误怎么解决?

    我为了数据安全,用windows专业版的bitlocker加密了一个固态硬盘SSD做的移动硬盘(u盘同理),在家里电脑(windows10 家庭版)打开的时候出现了参数错误 即使密码输入正确还是这个错 ...

  3. 【每日一题】【双指针、位运算】2022年2月3日-NC103 反转字符串

    描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000) 答案:双指针 import java.util.*; public class Solution { ...

  4. hdoj笔记1000

    1000,A+B problem #include <stdio.h>//要用EOF!! int main() { int a,b; while(scanf("%d%d" ...

  5. 使用docker中的MySQL

    简言 好久没写文章了,今天分享一篇将mysql移到docker容器.大家都是程序员,如何安装docker我就不说了.  1. 安装.启动mysql镜像 首先使用 docker search mysql ...

  6. java逻辑运算中 | | 和 | 的区别

    本文主要阐明逻辑运算中 | |(短路或) 和 |(逻辑或) 的异同 | | 和 | 的相同之处: 只有二者都是假时,结果才为假,否则结果为true. | | 和 | 的不同之处在于: a | | b: ...

  7. UVA439 Knight Moves

    原题Vjudge 题目大意 有一个骑士,他可以骑马日字型跳跃,问他从A点到B点最少要几步 解题思路 这题就是一个特别裸的广搜板子 它的主要问题在于输入输出 输入的数据我们可以用\(pair\)读入,第 ...

  8. JavaScript:原型(prototype)

    面向对象有一个特征是继承,即重用某个已有类的代码,在其基础上建立新的类,而无需重新编写对应的属性和方法,继承之后拿来即用: 在其他的面向对象编程语言比如Java中,通常是指,子类继承父类的属性和方法: ...

  9. Flask初步认识

    1.Flask基本认识 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展包(数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现.比如可以用 Flask 扩展加入ORM. ...

  10. Go语言的赞和喷

    (原发于 GitHub Pages,2019-01-01 23:22:43) 2019 年,我回来了. 不知不觉中,我入 PHP 的坑已经 3 年有余,入 Go 的坑也大半年了.作为不评论不舒服斯基星 ...