bzoj1072排列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1072
好像是这方面的裸题。
整除k 要想转移需要记录下 达到模k所有余数 的方案数。
为了生成排列,状压记录当前已用了原数组中的哪些位置;
因为是无顺序地取用的,所以可以有顺序地放在目标数组中,即续在上一个数后面;所以 导致的余数 就是 之前余数*10+这个数。
另一种想法是有顺序取用、无顺序放置;即用了前 i 个数,状压记录放在了哪些位置上;新加入一个数的贡献是 之前余数+这个数*1ek。
感觉第一种比较方便?
循环的顺序需要注意!要把状压的状态 j 放在最外面,而不是当前位置 i 。
dp的初值需要想想。
对于值相等的一些数字,在排列中无区别,dp的时候却有区别地对待了。
只需要对于每一组,答案除去它们的排列数(即阶乘)即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,a[],cnt,k,d[][],lm,ans,num[];
char ch;
int kj[]={,,,,,,,,,,};
int main()
{
scanf("%d",&t);
while(t--)
{
cnt=;ans=;
memset(d,,sizeof d);
memset(num,,sizeof num);
d[][]=;/////
scanf(" %c",&ch);
while(ch>=''&&ch<='')
{
a[++cnt]=ch-'';
num[a[cnt]]++;
ch=getchar();
}
lm=(<<cnt);
scanf("%d",&k);
for(int j=;j<lm;j++)//当前取用了原串中哪些位置(按顺序后续着放下)
for(int i=;i<=cnt;i++)
if((j&(<<(i-)))==)
for(int l=;l<k;l++)
d[j|(<<(i-))][(l*+a[i])%k]+=d[j][l];
ans=d[lm-][];
for(int i=;i<=;i++)ans/=kj[num[i]];
printf("%d\n",ans);
}
return ;
}
bzoj1072排列的更多相关文章
- BZOJ1072 排列perm 【状压dp】
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能 被2整除,其中末位为2的有30种,末位为4的有60种. Inpu ...
- [bzoj1072]排列
考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> ...
- DP——由蒟蒻到神犇的进阶之路
开始更新咯 DP专题[题目来源BZOJ] 一.树形DP 1.bzoj2286消耗战 题解:因为是树形结构,一个点与根节点不联通,删一条边即可, 于是我们就可以简化这棵树,把有用的信息建立一颗虚树,然后 ...
- 【BZOJ1072】排列(搜索)
[BZOJ1072]排列(搜索) 题面 BZOJ 洛谷 题解 算下复杂度,如果用\(next\_permutation\) 那就是\(10!\times 10\times 15\),复杂度不太对 那好 ...
- [BZOJ1072][SCOI2007] 排列prem
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
- 【BZOJ1072】【SCOI2007】排列 [状压DP]
排列 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 给一个数字串s和正整数d, 统计s有多 ...
- 【枚举】bzoj1072 [SCOI2007]排列perm
暴力,next_permutation函数用于枚举出下一个排列.sscanf函数用于将字符串转化成数字. #include<cstdio> #include<cstring> ...
- [BZOJ1072][SCOI2007]排列perm 状压dp
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2488 Solved: 1546[Submit][St ...
- [bzoj1072][SCOI2007][排列perm] (状态压缩+数位dp+排列去重)
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
随机推荐
- 安全模式下卸载windows installer打包的软件(转)
安全模式下卸载windows installer打包的软件 起因: 主机系统MAC,虚拟软件Parallels Desktop, 虚拟系统 Win 7. 今天在虚拟机WIN7里面安装了某个软件导致重启 ...
- 【vue系列】elementUI 穿梭框右侧获取当前选中项的值的思路
最近 做了一个需求 在查询结果的表格中,选取(可多选)一些值,获取到保单号后,打开一个elementUI的穿梭框,然后获取到所有业务员,选取一些业务员后,将上一步获取到的保单号传递给业务员. 画个示意 ...
- 14 printf输出格式及栈空间分配
假设在一个32位的 little endian的机器上运行下面程序,输出结果:1 0 2 #include<stdio.h> int main() { ,b=,c=; printf(&qu ...
- Git HEAD 意思详解 和版本回退
首先,Git必须知道当前版本是哪个版本,在git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版 ...
- 51nod算法马拉松28-c
题解: 按照每一个要求,分类讨论,讨论压下去了多少 代码: #include<bits/stdc++.h> using namespace std; ,N=; int n,A,B,C,an ...
- python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA
加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...
- call、apply的应用
call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来 ...
- 队(queue),C++模板实现
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Windows XP系统服役13年今正式退休
清明已过,服役13年的微软Windows XP系统也于今日正式“退休”.尽管这之后XP系统仍可以继续使用,但微软不再提供官方服务支持.对于中国数以亿计的XP用户来说,一方面是对已经使用了13年的操作系 ...
- mongodb添加延时节点
1. 简介 延时节点是主节点过去某个时间点的“数据快照”,通常用来做数据备份,如果主节点有误操作而删除了数据,可以通过延时节点来恢复数据.例如,当前时间是10:00,并且延时节点设置1个小时 ...