[bzoj1072] [SCOI2007]排列perm
有一种暴力算法就是直接枚举。
正解就是状压dp
令f[i][j]:i:使用的数位的状态j:当前的模数
边界:f[0][0] = 1;
f[i|1<<k][j*10+k % n] += f[i][j] | !(i&(1<<k))
答案就是f[i<<len-1][0]
进行了一些重复处理。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 15;
int main() {
// freopen("input", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
int f[1024 + 5][1000 + 10];
char s[maxn];
int n;
long long Ans;
scanf("%s %d", s, &n);
int a[maxn], Cnt[maxn];
int len = strlen(s);
f[0][0] = 1;
for (int i = 0; i < len; i++) {
a[i] = s[i] - '0';
++Cnt[a[i]];
}
for (int i = 0; i < 1 << len; i++) {
for (int j = 0; j < len; j++) {
for (int k = 0; k < len; k++) {
if (!(i & 1 << k)) {
f[i | (1 << k)][(j * 10 + k) % n] += f[i][j];
}
}
}
}
Ans = f[(1 << len) - 1][0];
for (int i = 0; i <= 9; i++) {
for (int j = 1; j <= Cnt[i]; j++) {
Ans /= j;
}
}
printf("%lld\n", Ans);
/* char s[maxn];
int n;
scanf("%s %d", s, &n);
int a[maxn];
int len = strlen(s);
for (int i = 0; i < len; i++)
a[i] = s[i] - '0';
sort(a, a + len);
set<long long> st;
st.clear();
int ans = 0;
while (1) {
long long num = 0;
for (int j = 0; j < len; j++)
num = num * 10 + a[j];
if (st.count(num))
continue;
else if (!(num % n)) {
st.insert(num);
ans++;
}
if (!next_permutation(a, a + len))
break;
}
printf("%d\n", ans);*/
}
return 0;
}
[bzoj1072] [SCOI2007]排列perm的更多相关文章
- [BZOJ1072][SCOI2007]排列perm 状压dp
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2488 Solved: 1546[Submit][St ...
- 【枚举】bzoj1072 [SCOI2007]排列perm
暴力,next_permutation函数用于枚举出下一个排列.sscanf函数用于将字符串转化成数字. #include<cstdio> #include<cstring> ...
- [bzoj1072][SCOI2007][排列perm] (状态压缩+数位dp+排列去重)
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
- BZOJ 1072: [SCOI2007]排列perm 状态压缩DP
1072: [SCOI2007]排列perm Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为 ...
- SCOI2007排列perm
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 805 Solved: 497[Submit][Stat ...
- BZOJ 1072 [SCOI2007]排列perm
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1268 Solved: 782[Submit][Sta ...
- [BZOJ1072][SCOI2007] 排列prem
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
- 1072: [SCOI2007]排列perm - BZOJ
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种.Input ...
- [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...
随机推荐
- bootstrap使用心得及css模块化的初步尝试
第一次用bootstrap到实战项目,是一个企业门户站,可以说是强行拿bootstrap上来练手,感觉并不适合. 我是用的less编译bootstrap文件,直接改less变量.然后把不可重用的部分, ...
- 命令行环境下简单实用的工具——重定向&管道
如果你对管道和重定向应用自如了,无需继续往下看.本文虽然以windows上cmd命令行环境演示,但同样适用于Unix/Linux等平台. 引言 关于管道和重定向,最初是在刘汝佳的<算法竞赛入门经 ...
- Spring的jdbcTemplate查询执行原生sql
在spring与hibernate整合时进行数据库检索,执行原生sql: public AppointmentEvaluateVo searchMyfeedbackDetail(String acco ...
- linux下动态链接库解决方案(二)
以前写过一个关于linux下用c++写动态链接库无法通过的解决方案,今天看到<linux C程序设计-王者归来>这本书,书中有个更容易的解决方案,特此记录下来 书中使用的是c语言,我改用c ...
- JQuery中对option的添加、删除、取值
jQuery获取Select选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Selec ...
- ul、li分列显示
目的很简单:有一个 ul>li 列表,默认为单列显示,把它变为两列显示. 方法1,使用DIV+CSS代码: <style type="text/css"> .my ...
- css3 transition
<html> <head lang="en"> <meta charset="UTF-8"> <title ...
- 使用VS2010编译64的Geos库
Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...
- 安天AVLTeam送福利喽~~
#福利来了# duang~duang~duang~ 安小天帮你辨别短信真伪!!! 是不是经常收到真假难辨的[疑似诈骗短信]是真的?是假的? 傻傻分不清楚 现在不用怕啦!!! 遇到这种情况,只需手机截 ...
- Tortoise SVN 使用帮助
同步至本地:新建文件夹,SNV checkout 输入用户名密码,确认. 上传文件:将要上传的文件放在一个文件夹里,选择要上传的文件所在的文件夹,右键单击,tortoiseSVN,Import,选择要 ...