排列perm HYSBZ - 1072(状压dp/暴力)
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
题解
其中判断语句的含义是在II状态中,KK号没有选择出来。
状态转移结束后,由于数串中可能存在重复的数字(样例已经给出来了),这个时候我们就会有许多重复的计算。这个问题很好解决,我们根据排列的知识将最后的Ans/=Cnt[I] Cnt[I] 记录数字I在数串中出现的次数)就可以了。
C++代码/暴力
#include<bits/stdc++.h>
using namespace std;
int a[],b[];
int n ,d;
int ans ;
void dfs(int i,long long x){
if(i > n){ if(x % d == ) ans ++;
return;
}
for(int j = ;j <= ;j ++){
if(b[j]) {
--b[j];
dfs(i + ,x * + j);
++b[j];
}
}
} int main(){
int t;
cin >> t;
while(t--){
string str;
cin >> str;
ans = ;
n = str.size();
memset(a,,sizeof a);
memset(b,,sizeof b);
for(int i = ; i < str.size() ; i++){
a[i] = str[i] - '';
b[a[i]]++;
}
cin >> d;
dfs(,);
cout << ans << endl;
}
}
C++代码/状压
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define DB double
#define SG string
#define LL long long
#define DP(A,B) DP[A][B]
#define Fp(A,B,C,D) for(A=B;A<=C;A+=D)
#define Fm(A,B,C,D) for(A=B;A>=C;A-=D)
#define Clear(A) memset(A,0,sizeof(A))
using namespace std;
const LL Mod=1e9+;
const LL Max=2e3+;
const LL Inf=1e18;
LL T,M,Num[Max],Cnt[Max],DP[Max][Max];
inline LL Read(){
LL X=;char CH=getchar();bool F=;
while(CH>''||CH<''){if(CH=='-')F=;CH=getchar();}
while(CH>=''&&CH<=''){X=(X<<)+(X<<)+CH-'';CH=getchar();}
return F?-X:X;
}
inline void Write(LL X){
if(X<)X=-X,putchar('-');
if(X>)Write(X/);
putchar(X%+);
}
int main(){
LL I,J,K,L;
T=Read();
while(T--){
Clear(Cnt);Clear(DP);
char CH[];scanf("%s",CH+);
LL Length=strlen(CH+);M=Read();
Fp(I,,Length,){
Num[I]=CH[I]-'';
Cnt[Num[I]]++;
}DP(,)=;
K=(<<Length)-;
Fp(I,,K,){
Fp(J,,M-,){
Fp(L,,Length,){
if((I&(<<(L-)))==){
DP(I|(<<(L-)),((J<<)+(J<<)+Num[L])%M)+=DP(I,J);
}
}
}
}LL Ans=DP(K,);
Fp(I,,,){
Fp(J,,Cnt[I],){
Ans/=J;
}
}Write(Ans);putchar('\n');
}
return ;
}
排列perm HYSBZ - 1072(状压dp/暴力)的更多相关文章
- N - 寿司晚宴 HYSBZ - 4197 状压dp
N - 寿司晚宴 HYSBZ - 4197 推荐题解 这个题目我觉得还是很难的,借助题解写出来的,题解还看了很久,现在还是不是很理解. 首先这个数比较大有500,如果直接就像这个题目S - Query ...
- bzoj 1072状压DP
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 1448[Submit][St ...
- bzoj 1072 状压DP
我们用w[i][j]来表示,i是一个二进制表示我们选取了s中的某些位,j表示这些位%d为j,w[i][j]则表示这样情况下的方案数,那么我们可以得到转移.w[i|(1<<k)][(j*10 ...
- K - Painful Bases 状压dp
Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...
- [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
- BZOJ1072 排列perm 【状压dp】
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能 被2整除,其中末位为2的有30种,末位为4的有60种. Inpu ...
- B1072 [SCOI2007]排列perm 状压dp
很简单的状压dp,但是有一个事,就是...我数组开大了一点,然后每次memset就会T,然后开小就好了!!!震惊!以后小心点这个问题. 题干: Description 给一个数字串s和正整数d, 统计 ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
随机推荐
- 莫队算法 ( MO's algorithm )
莫队算法是由清华大学神牛莫涛发明的一种处理区间问题的离线算法 算法核心是通过先将问询区间总长度平方分块.然后将所有的问询区间按照左端点所在的块编号排序.在同一块内的则按右端点升序 然后设置左右两个下标 ...
- HDU2294--Pendant(DP,矩阵优化)
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- [CSP-S模拟测试]:取石子(博弈论+DP)
题目描述 有三堆石子,它们的石子个数分别为$x,y,z$.$A$和$B$正在博弈,由$A$先手,双方轮流操作.每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取 ...
- Redis大key的发现与删除方法全解析
个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...
- MongoDB通过JavaDriver执行shell命令,例如创建sharding collection
Mongodb的java driver本身的接口 void createCollection(String collectionName, CreateCollectionOptions create ...
- jQuery file upload上传图片的流程
先触发_onChange[jquery.fileupload.js] _onChange: function (e) { var that = this, data = { fileInput: $( ...
- java7和java8新特性
以下来至网址: http://blog.csdn.net/samjustin1/article/details/52268004 Java7 新特性 1.switch中可以使用字符串了 String ...
- leetcode-mid-sorting and searching-34 Search for a Range
mycode 63.98% class Solution(object): def searchRange(self, nums, target): """ :typ ...
- C语言指令数组名和数组名取地址
以下C语言指令:int a[5] = {1, 3, 5, 7, 9}; int *p = (int *)(&a + 1); printf("%d, %d", *(a + 1 ...
- Java ——补充:构造方法 super()与构造方法 无参 有参构造方法 this()与构造方法
参考文章: https://blog.csdn.net/qq_33322074/article/details/86030836 https://blog.csdn.net/HD243608836/a ...