bzoj1072】的更多相关文章

[BZOJ1072]排列(搜索) 题面 BZOJ 洛谷 题解 算下复杂度,如果用\(next\_permutation\) 那就是\(10!\times 10\times 15\),复杂度不太对 那好办啊,把\(next\_permutation\)改成搜索不就完了.. #include<iostream> #include<cstring> using namespace std; char ch[15]; int a[10],d,ans,n; void dfs(int x,in…
有一种暴力算法就是直接枚举. 正解就是状压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() { //…
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 1…
还是那句话s<=10 必然想到状压 题目唯一的难点在于怎么转移整除 整除即是mod d=0,我们用f[cur,j]表示选取状况为cur,余数为j的方案数 注意一个数a1a2a3…an (ai表示第i位的数字) 这个数可以这样表示[(a1*10+a2)*10+a3]*10…… 根据mod的运算律,所以转移就很明显了吧 注意这里算出的方案数没有考虑几个数字重复的情况 所以还要用可重复排列的技术方法除一下 ..,..] of longint;     s,a,d:..] of longint;    …
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1072 好像是这方面的裸题. 整除k 要想转移需要记录下 达到模k所有余数 的方案数. 为了生成排列,状压记录当前已用了原数组中的哪些位置: 因为是无顺序地取用的,所以可以有顺序地放在目标数组中,即续在上一个数后面:所以 导致的余数 就是 之前余数*10+这个数. 另一种想法是有顺序取用.无顺序放置:即用了前 i 个数,状压记录放在了哪些位置上:新加入一个数的贡献是 之前余数+这个数*1ek…
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…
排列 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0). 例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input 输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间用空格隔开. Output 每个数据仅一行,表示能被d整除的排列的个数. Sample I…
状压dp,f[i][j]表示当前取了i,模数余j的状态. 然后向后推,枚举可能的数即可. 注意每个数存在重复,最后要除以相应出现次数的阶乘. #include<bits/stdc++.h> using namespace std; ],c[],len,f[][],ans; ]; int main(){ int T;scanf("%d",&T); while(T--){ memset(c,,,sizeof(f)); scanf(][]=; ;i<len;i++)…
暴力,next_permutation函数用于枚举出下一个排列.sscanf函数用于将字符串转化成数字. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,len,ans; long long x,t; ]; int main() { scanf("%d",&n); ;i<=n;i++) { ans=; scanf(&quo…
1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2488  Solved: 1546[Submit][Status][Discuss] Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input 输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间…