【62.89%】【BZOJ 1072】[SCOI2007]排列perm
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1862 Solved: 1171
[Submit][Status][Discuss]
Description
给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。例如123434有90种排列能
被2整除,其中末位为2的有30种,末位为4的有60种。
Input
输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间用空格隔开。s保证只包含数字0, 1
, 2, 3, 4, 5, 6, 7, 8, 9.
Output
每个数据仅一行,表示能被d整除的排列的个数。
Sample Input
000 1
001 1
1234567890 1
123434 2
1234 7
12345 17
12345678 29
Sample Output
3
3628800
90
3
6
1398
HINT
在前三个例子中,排列分别有1, 3, 3628800种,它们都是1的倍数。
【限制】
100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15
【题解】
设f[i][j]表示哪些数字被按顺序放在了前面。i的范围是0..2^10-1.
j是按照数字放的顺序组成的十进制数mod d的结果。
然后我们从小到大枚举状态i。
然后看看状态i有哪个数字没有被按顺序放下去。
假设t这个数字没有被放下去。
就把t这个数字接在前面已经放好顺序的数字后面。
根据同余律(numpre*10 + t) %k == 把t接在前面的数字后面组成的数字 % k;
然后比如这样的
序列 1 3 5 5 6
它的不重复排列为 A(5,5)/A(2,2);
1 3 3 5 5 6
它的不重复排列为A(6,6)/(A(2,2)*A(2,2));
所以最后得到的f[2^len - 1][0] 要除(chongfu[i]!) ,i∈[0..9]
【代码】
#include <cstdio>
#include <cstring> int t;
char s[15];
int d,num[15],a[15],len;
int f[1 << 11][1010],two_n[11],fac[11]; int main()
{
//freopen("F:\\rush.txt", "r", stdin);
two_n[0] = 1;
for (int i = 1; i <= 10; i++)
two_n[i] = two_n[i - 1] * 2;//预处理出2^x
fac[0] = 1;
for (int i = 1; i <= 10; i++)//处理出n!
fac[i] = fac[i - 1] * i;
scanf("%d", &t);
while (t--)
{
memset(num, 0, sizeof(num));
memset(f, 0, sizeof(f));
scanf("%s", s);
scanf("%d", &d);
len = strlen(s);
for (int i = 1; i <= len; i++)
{
a[i] = s[i - 1] - '0';
num[a[i]]++;
}
f[0][0] = 1;
for (int i = 0; i <= two_n[len]; i++)
for (int k = 0;k <= d-1;k++)
for (int j = 1;j <= len;j++)
if ((i & two_n[j - 1])== 0)
f[i | two_n[j - 1]][(k * 10 + a[j]) % d] += f[i][k];//或运算对于把这个数字加到后面
for (int i = 0; i <= 9; i++)
f[two_n[len] - 1][0] /= fac[num[i]];
printf("%d\n", f[two_n[len] - 1][0]);
}
return 0;
}
【62.89%】【BZOJ 1072】[SCOI2007]排列perm的更多相关文章
- BZOJ 1072: [SCOI2007]排列perm 状态压缩DP
1072: [SCOI2007]排列perm Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为 ...
- BZOJ 1072 [SCOI2007]排列perm
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1268 Solved: 782[Submit][Sta ...
- [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...
- BZOJ 1072: [SCOI2007]排列perm [DP 状压 排列组合]
题意:给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0) 100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15 看到整 ...
- 【以前的空间】bzoj 1072 [SCOI2007]排列perm
又颓废了一个下午,最近撸mc撸到丧失意识了,玩的有点恶心,于是找水题做,瞧不起颓废的自己啊. another水题. 这题题意很明显啦,就是找数字排列后组成的数去mod d=0后有多少种. 普通的搜索的 ...
- BZOJ 1072 [SCOI2007]排列perm ——状压DP
[题目分析] 没什么好说的,水题. 代码比较丑,结果需要开long long 时间爆炸 [代码] #include <cstdio> #include <cstring> #i ...
- bzoj 1072: [SCOI2007]排列perm【状压dp】
先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 #include<iost ...
- bzoj 1072: [SCOI2007]排列perm 状压dp
code: #include <bits/stdc++.h> #define N 1005 using namespace std; void setIO(string s) { stri ...
- 【BZOJ】1072: [SCOI2007]排列perm(状压dp+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1072 首先无限膜拜题解orz表示只会暴力orz 数据那么小我竟然想不到状压! orz 这种题可以取模 ...
- 1072: [SCOI2007]排列perm - BZOJ
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种.Input ...
随机推荐
- More Effective C++: 06杂项讨论
32:在未来时态下发展程序 世事永远在变,好的软件对于变化有良好的适应能力:可以容纳新的性质,可以移植到新的平台,可以适应新的需求,可以掌握新的输入.所谓在未来时态下设计程序,就是接受“事情总会改变” ...
- js中+号强制转换小例子
1 <script> console.log(([]+{}).length); </script> </head> 输出竟然是: 为什么会是15呢? 因为在+号的强 ...
- jQuery第3天
复习 如何区别 JS DOM对象和 JQ 包装对象? JQ对象其实是经过包装的DOM对象,包装后可调用 JQ 的方法. JS 对象基本上都是属性为主,JQ基本上都方法为主. 可通过 console.d ...
- 设置onselectstart在ie浏览器下对于input及textarea标签页会生效
设置onselectstart在ie浏览器下对于input及textarea标签页会生效, 可以使用js来控制对于某种标签不生效,代码如下: document.onselectstart = disa ...
- jq 添加内容
向页面动态添加内容,一般用于动态网页,需要即时请求数据,并更新在页面上,使用append()更多一些,empty() - 清空所有子元素,remove() - 清除自身所有子元素. append() ...
- 【Leetcode链表】两两交换链表中的节点(24)
题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2- ...
- 在沙箱中IE不能上网的解决方法
近期在解决一个问题,在我们的沙箱中IE不能上网 现象: IE不能上网.输入www.baidu.com 提示:不能查找到DNS.也不能ping 通 其它浏览器上网没有问题(SG浏览器,C ...
- 《C语言深度解剖》学习笔记之内存管理
第5章 内存管理 1.野指针 定义指针变量的同时最好初始化为NULL,用完指针后也将变量的值设置为NULL.也就是说除了使用时,别的时间都把它设置为NULL 2.堆,栈和静态区 堆:由malloc系列 ...
- LOJ 10239 有趣的数列
LOJ 10239 有趣的数列 首先可以将奇数视作入栈,偶数视作出栈,那么它是卡特兰数,其实打表也能看出来,而且好像可以用dp? 不过这道题的难点不在这里,p不是素数,所以不能用求逆元来做,不过前50 ...
- @codechef - SERSUM@ Series Sum
目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @description@ ...