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

7

000 1

001 1

1234567890 1

123434 2

1234 7

12345 17

12345678 29

Sample Output

1

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的更多相关文章

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

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

  2. BZOJ 1072 [SCOI2007]排列perm

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

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

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

  4. BZOJ 1072: [SCOI2007]排列perm [DP 状压 排列组合]

    题意:给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0) 100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15 看到整 ...

  5. 【以前的空间】bzoj 1072 [SCOI2007]排列perm

    又颓废了一个下午,最近撸mc撸到丧失意识了,玩的有点恶心,于是找水题做,瞧不起颓废的自己啊. another水题. 这题题意很明显啦,就是找数字排列后组成的数去mod d=0后有多少种. 普通的搜索的 ...

  6. BZOJ 1072 [SCOI2007]排列perm ——状压DP

    [题目分析] 没什么好说的,水题. 代码比较丑,结果需要开long long 时间爆炸 [代码] #include <cstdio> #include <cstring> #i ...

  7. bzoj 1072: [SCOI2007]排列perm【状压dp】

    先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 #include<iost ...

  8. bzoj 1072: [SCOI2007]排列perm 状压dp

    code: #include <bits/stdc++.h> #define N 1005 using namespace std; void setIO(string s) { stri ...

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

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

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

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

随机推荐

  1. C++之ARX 读取配置文件内容时,会出现编码问题(utf-8转unicode)

    CString CConvert::UTF82WCS(const char* szU8){ //预转换,得到所需空间的大小; int wcsLen = ::MultiByteToWideChar(CP ...

  2. 从 Program Manager 看 Leader 是什么角色

    http://blog.csdn.net/uxyheaven/article/details/50396951 从 Program Manager 看 Leader 是什么角色 转载请注明出处http ...

  3. ios开发使用Basic Auth 认证方式

    http://blog.csdn.net/joonchen111/article/details/48447813 我们app的开发通常有2种认证方式   一种是Basic Auth,一种是OAuth ...

  4. openjudge dp水题记录

    当发现自己竟然不会打dp的时候内心是崩溃的,然后按照一年前的刷题记录刷openjudge,然后发现自己准确率比一年前(刚学信竞两个月时)的准确率低得多,已经没救. 列一下最近打的几道sb题 2985: ...

  5. jsp中的标签使用

    jsp中的变量作用域 表示变量的作用域,一共4种.pageScope:  表示变量只能在本页面使用.requestScope:表示变量能在本次请求中使用.sessionScope:表示变量能在本次会话 ...

  6. 16.libgdx根据配置文件生成布局(未完)

    思路: screen分为普通和复杂两种,普通的功能大部分是页面跳转以及简单的crud数据,复杂的单独弄出来 跳转普通的screen,直接根据配置文件调整设置 <layouts> <l ...

  7. nodeJs学习-05 案例:http/fs/querystring/url

    const http = require('http'); const fs = require('fs'); const querystring = require('querystring'); ...

  8. 重磅开源|AOP for Flutter开发利器——AspectD

    https://github.com/alibaba-flutter/aspectd 问题背景 随着Flutter这一框架的快速发展,有越来越多的业务开始使用Flutter来重构或新建其产品.但在我们 ...

  9. @loj - 2174@ 「FJOI2016」神秘数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...

  10. 归并排序及应用 (nyoj 117 求逆序数)

    求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中 ...