HDU 5657 CA Loves Math 状压DP + 枚举
题意:
给出\(A(2 \leq A \leq 11), n(0 \leq n \leq 10^9), k(1 \leq k \leq 10^9)\)。
求区间\([1, A^n]\)中各个数字互不相同的\(A\)进制数而且是\(k\)的倍数的个数。
分析:
如果\(n > A\),根据抽屉原理,\(n\)位\(A\)进制数一定会有重复的数字。
所以下面只讨论\(n \leq a\)的情况。
对于\(k\)的大小,分别使用不同的算法:
\(k\)比较小的时候,用状压DP:\(d(S, x)\)表示当前数字集合为\(S\)且模\(k\)为\(x\)的数字的个数。
在数字的末位添加一个未在集合\(S\)出现的数字\(i\),则转移到状态\(d(S',(x \cdot A + i) % k)\)。\(k\)比较大的时候,直接暴力统计。枚举区间内所有\(k\)的倍数,判断一下如果没有重复数字答案+1。
第一种算法的复杂度为\(O(2^A \cdot k \cdot A)\),状态数乘转移数。
第二种算法复杂度为\(O(A^n/k \cdot A)\),枚举次数乘判断时间。
找到一个合适的边界使得时限都能承受两种算法,测试了一下\(25000\)和\(30000\),运行时间都是\(3s\)多,可以AC。
PS:\(n=0\)和\(n=1\)这些边界情况最好特判一下。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int A, n, k;
const int maxk = 30000;
const int maxa = 11;
LL d[1 << maxa][maxk];
int bitcount(int x) {
int ans = 0;
while(x) { if(x & 1) ans++; x >>= 1; }
return ans;
}
bool check(LL x) {
int S = 0;
while(x) {
int t = x % A;
x /= A;
if(S & (1 << t)) return false;
S |= (1 << t);
}
return true;
}
int main()
{
int T; scanf("%d", &T);
while(T--) {
scanf("%d%d%d", &A, &n, &k);
if(n == 0) {
if(k == 1) printf("1\n");
else printf("0\n");
continue;
}
if(n == 1) {
printf("%d\n", A / k);
continue;
}
//DP
if(k < maxk) {
memset(d, 0, sizeof(d));
for(int i = 1; i < A; i++) d[1 << i][i % k] = 1;
for(int S = 0; S < (1 << A); S++) if(bitcount(S) < n) {
for(int x = 0; x < k; x++) if(d[S][x]) {
for(int i = 0; i < A; i++) if(!(S&(1<<i))) {
d[S|(1<<i)][(x*A+i)%k] += d[S][x];
}
}
}
LL ans = 0;
for(int S = 0; S < (1 << A); S++)
if(d[S][0]) ans += d[S][0];
printf("%lld\n", ans);
} else {
if(n > A) n = A;
LL An = 1; //A^n
for(int i = 1; i <= n; i++) An *= A;
LL ans = 0;
for(LL t = k; t <= An; t += k)
if(check(t)) ans++;
printf("%lld\n", ans);
}
}
return 0;
}
HDU 5657 CA Loves Math 状压DP + 枚举的更多相关文章
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- HDU 6149 Valley Numer II 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...
- HDU 1074 Doing Homework【状压DP】
Doing Homework Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- HDU 1074 Doing Homework(状压DP)
第一次写博客ORZ…… http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 http://acm.hdu.edu.cn/showproblem.p ...
- HDU - 4284 Travel(floyd+状压dp)
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...
- HDU 4906 Our happy ending (状压DP)
HDU 4906 Our happy ending pid=4906" style="">题目链接 题意:给定n个数字,每一个数字能够是0-l,要选当中一些数字.然 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- HDU 4568 Hunter 最短路+状压DP
题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...
随机推荐
- jar 压缩 解压 war包
Win+R 输入cmd进入命令行,进入到源码所在目录.所用工具,jdk自带的jar.exe 打包命令:jar -cvf xxx.war * 解包命令: jar -xvf xxx.war * 参数 说明 ...
- JavaScript随机生成颜色以及十六进制颜色 与RGB颜色值的相互转换
/** * 随机生成颜色 * @return 随机生成的十六进制颜色 */ function randomColor(){ var colorStr=Math.floor(Math.random()* ...
- css3的transform变换scale和translate等影响jQuery的position().top和offset().top
css3的transform变换scale和translate等影响jQuery的position().top和offset().top
- 学习笔记:MDN的JavaScript
JavaScript 第一步 什么是JavaScript? 每次当你浏览网页时不只是显示静态信息—— 显示即时更新的内容, 或者交互式的地图,或 2D/3D 图形动画,又或者自动播放视频等,你可以确信 ...
- JAVA继承与使用
说来惭愧,java学完已经两年了,开发也已经做了快一年了,现在才基本了解继承怎么用,平时都是在一个类中乱写一气.现在感觉原来学的知识真正运用起来还是具有一定的差距.希望能够先夯实基础,共勉.写一下自己 ...
- Apache Spark 2.2.0 中文文档 - Structured Streaming 编程指南 | ApacheCN
Structured Streaming 编程指南 概述 快速示例 Programming Model (编程模型) 基本概念 处理 Event-time 和延迟数据 容错语义 API 使用 Data ...
- 如何使用VS将项目生成一个安装包?
VS2010项目的部署与安装winform程序,我想进行安装.1.在解决方案中 ——点击右键——添加 2.然后选择 安装和部署 ——安装向导 可以更改名称 3.点击 下一步 4.然后选择上那3个 5. ...
- uvm_sqr_ifs——TLM1事务级建模方法(四)
与uvm_tlm_if_base 一样,这个类也没有派生自任何类,定义了如下几个接口:get_next_item, try_next_item, item_done, get, peek, put, ...
- 微软高性能缓存AppFabric (一) 安装
博客原文链接:http://www.cnblogs.com/Qbit/p/6088703.html AppFabric 缓存功能的前身是VeloCity ,它是基于windows平台的一个高速内存缓存 ...
- js表单序列化时,非空判断
在项目中,对于数据的传输一般需要非空的判断,而数据字段较多时一般直接将表单序列化,此时如何判断非空,如下 因为将表单序列化时,数据格式为 trainKind=1&trainKindCode=1 ...