首页 > 其他分享 >洛谷P4163[SCOI2007]排列

洛谷P4163[SCOI2007]排列

时间:2024-08-28 10:28:35浏览次数:4  
标签:排列 洛谷 int P4163 SCOI2007 dp

洛谷P4163 [SCOI2007] 排列

题意

给一个数字串 \(s\) 和正整数 \(d\), 统计 \(s\) 有多少种不同的排列能被 \(d\) 整除(可以有前导 \(0\))。

思路

考虑状压dp。

\(dp_{S,k}\) 表示当前已经选定了 \(S\) 集合(下标)的数,模 \(d=k\) 的方案数。

状态转移方程:

\[dp_{S|2^j,(k\times10+s_j)\bmod d} \mathrel{+}=dp_{S,k} \]

需要注意如果有数字出现了多次,会计算重复。

若一个数出现了 \(c\) 次,答案除以 \(c!\) 即可。

时间复杂度:\(O(Tn2^nd)\)。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
int dp[1 << 11][1005];
int fac[15];
signed main() {
	int T; cin >> T;
	string S; int d;
	fac[0] = 1;
	for (int i = 1; i <= 10; i ++) fac[i] = fac[i - 1] * i;
	while (T --) {
		memset(dp, 0, sizeof(dp));
		cin >> S >> d;
		dp[0][0] = 1;
		for (int i = 0; i < (1 << S.size()); i ++) {
			for (int j = 0; j < S.size(); j ++) {
				if (i >> j & 1) continue;
				for (int k = 0; k < d; k ++) {
					dp[i | (1 << j)][(k * 10 + S[j] - '0') % d] += dp[i][k];	
				}
			}
		}
		int ans = dp[(1 << S.size()) - 1][0];
		for (int i = 0; i <= 9; i ++) {
			int c = 0;
			for (auto x : S) {
				if (x == i + '0') c ++;
			}
			ans /= fac[c]; // 除去重复
		}
		cout << ans << "\n";
	}
	return 0;
}

标签:排列,洛谷,int,P4163,SCOI2007,dp
From: https://www.cnblogs.com/maniubi/p/18384077

相关文章

  • 洛谷P10931 闇の連鎖
    洛谷P10931闇の連鎖题意给定一棵\(n\)个点的树,有\(m\)条附加边。第一次删除一条树边,第二次删除一条附加边。求有多少种方案使原来的树不联通。思路考虑求出\(f_i\)表示\(i\)的子树中有多少条附加边连向\(i\)的子树外。若\(f_i=0\),则把\(i\)与\(i\)的父亲之间......
  • 洛谷 P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two
    [USACO2.4]两只塔姆沃斯牛TheTamworthTwo题目描述两只牛逃跑到了森林里。FarmerJohn开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。追击在10×......
  • 洛谷SCP 2024 第一轮(初赛 J 组)模拟题解析(第三部分:完善程序(1-2))
    完善程序一(补全)#include<bits/stdc++.h>usingnamespacestd;constintMAXN=100000;intn;intvis[MAXN],a[MAXN];vector<int>ans;intcheck(intk){intx=n,top=0;for(inti=0;i<=k;i++)vis[i]=0;while(x......
  • 洛谷 P8615 [蓝桥杯 2014 国 C] 拼接平方数
    题面题目描述小明发现很有趣,首先,它是个平方数。它可以拆分为和,拆分出来的部分也是平方数。也有这个性质,我们权且称它们为:拼接平方数。可拆分,这有点勉强,我们规定,等都不算平方数。小明想:还有哪些数字是这样的呢?你的任务出现了:找到某个区间的所有拼接平方数。输入......
  • 洛谷P2440 木材加工 题解
    这是我找到的一篇很久之前为了让我更好理解二分写的详细题解题目链接code:#include<bits/stdc++.h>#defineintlonglong#defineMAXN0x3f3f3f3f3f3f3f3f#defineMINN-0x3f3f3f3f3f3f3f3f#defineMiraiios::sync_with_stdio(0),cin.tie(0),cout.tie(0);usingnamespa......
  • 洛谷P1605 迷宫
    原题题目描述给定一个方格的迷宫,迷宫里有处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第一行为三个正整数,分......
  • 将洛谷私信接入Windows
    首先下载一个私信Github:https://github.com/GCSG01/LG_Show_Massger/archive/refs/heads/main.zip然后解压,找到src/settings.json,把你的洛谷cookie和UID填进去,点击Start.cmd运行。(其余的不要改)之后不出意外就会有两个窗口:AI功能:下载仓库:https://github.com/OI-liyi......
  • 洛谷P10878 [JRKSJ R9] 在相思树下 III && 单调队列
    传送门:P10878[JRKSJR9]在相思树下III将军啊,早卸甲,他还在廿二,等你回家……一道练习单调队列的好题qwq题目意思:很明白了,不再复述。(注意$\foralli$表示对于任意的i,可理解为所有)思路:贪心是很明显的,因为我们要让最后的值最大,首先要把小的值删掉。最后的答案就是进......
  • 洛谷P1182 数列分段 Section II
    传送门:P1182数列分段SectionII消灭人类暴政,世界属于三体题目意思:题目说的很明白了思路:考虑部分分:20%的数据保证n<10,直接爆搜;40%的数据保证n<1000,n^2+前缀和搞定100%的数据:求每段最大和的最小值:明显的二分(n在10^5的范围也说明了这一点,因为二分查找的......
  • 洛谷P1540 [NOIP2010 提高组] 机器翻译答案
    #include<bits/stdc++.h>usingnamespacestd;/*数据结构:队列queue 桶:标记某个单词是否出现在内存中 t[i]=false:不在t[i]=true:在对于读入的每个单词x: 如果不存在单词x 存储(入队) t[x]=true 内存中元素个数(q.size())>M: t[q.front()]=falses; ......