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 ...
随机推荐
- @SpringBootApplication的使用
之前用户使用的是3个注解注解他们的main类.分别是@Configuration,@EnableAutoConfiguration,@ComponentScan.由于这些注解一般都是一起使用,spri ...
- Centos中彻底删除Mysql(rpm、yum安装的情况)
[root@data lib]# rpm -qa¦grep mysqlmysql-5.5.25-1.el6.remi.i686mysql-libs-5.5.25-1.el6.remi.i686comp ...
- 铺音out1
1◆ 单个 c k s tʃ g gg g dʒ 2◆ 多个 si dʒ su wr w wh sc s ph f gh ck ʃ ch sh tc ...
- JdbcTemplate.queryForObject
} catch (EmptyResultDataAccessException e) { log.info(">>>检测到有无记录>>>>" ...
- jsp jsp常用指令
jsp指令是为jsp引擎设计的,他们并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面中的其余部分. jsp中的指令 page指令 include指令 taglib指令 jsp指令的基本语法 ...
- bzoj1677
题解: 背包 每一个1<<i都是无限量 代码: #include<bits/stdc++.h> using namespace std; ,M=1e9; int n,dp[N] ...
- & | ^ ~ << >> 按位运算符
与(&) |(或) ^(异或) ~(取反) <<(左移) 先将两个数全部转化成为2进制再进行比较,再进行比较,位数不同则前面添0变为位数相同,然后再将得到的结果转化为你想要的类型 ...
- STL标准库-容器适配器
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class ...
- 将PS/2接口鼠标改造成USB接口鼠标
改造接线图 不是所有PS/2鼠标都可以改为USB鼠标的,可以改的PS/2鼠标的特征: A.早期PS/2鼠标电路板一般带有两块集成电路,(一块光电感应,一块按键或USB协议转换,和一只24M的晶体振荡器 ...
- pygame精灵类实现房子爆炸效果
# coding=utf8 import random import pygame from pygame.locals import * from cStringIO import StringIO ...