题意:

给出\(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 + 枚举的更多相关文章

  1. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  2. HDU 6149 Valley Numer II 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...

  3. HDU 1074 Doing Homework【状压DP】

    Doing Homework Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he ...

  4. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  5. HDU 1074 Doing Homework(状压DP)

    第一次写博客ORZ…… http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 http://acm.hdu.edu.cn/showproblem.p ...

  6. 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 ...

  7. HDU 4906 Our happy ending (状压DP)

    HDU 4906 Our happy ending pid=4906" style="">题目链接 题意:给定n个数字,每一个数字能够是0-l,要选当中一些数字.然 ...

  8. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  9. HDU 4568 Hunter 最短路+状压DP

    题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...

随机推荐

  1. Spring AOP初步总结(三)

    最近遇到一个新需求:用户多次点击提交订单发生多次扣款,一开始准备配置数据库事务,但后来发现这种方法白白浪费很多资源,就改为利用接口上的切面对请求做拦截,并将当前登陆的用户存进Redis缓存,废话不说了 ...

  2. java-jsch实现sftp文件操作

    (曾在天涯)的文章详细讲解了jsch中的函数以及用法 http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html http://www. ...

  3. python基础之循环语句

    一.if条件语句: 语法: 1.if单分支(单重条件判断) if expression: expr_true_suite 注释:expession为真执行代码expr_true_suite if单分支 ...

  4. ubuntu16.04解决屏幕适应问题

    打开ubuntu登录进去后,输入: sudo  apt-get installopen-vm-tools sudo apt-get install open-vm* 然后重启(reboot),即可解决 ...

  5. sql server 2012安装程序图

    重点:下面的安装步骤都在断网环境下安装的 因为我想查看联网跟没有联网SQL2012会不会下载并安装.net2.0 和.net3.5和.net4和SP1补丁包 我的环境: 没有集成SP1补丁包的安装包大 ...

  6. Mysql数据库插入时乱码问题解决

    我们在利用cmd的黑屏界面进行mysql数据的插入时往往会出现不能插入的情况,这个原因是因为我们系统虽然和服务器端即mysql的数据库采用的都是统一的utf8的编码,但是在传输的过程中会变成iso88 ...

  7. 详细讲解:tp3.2.3生成验证码并进行验证(ajax校验返回及自定义返回)

    TP3.2.3的验证码也是比较经典的小功能,框架对这个小功能的封装还是比较完美的,废话不多说,开始记录 1.总体效果: (1)初始界面 (2)自定义的返回校验效果: (3)ajax的校验返回: 2.代 ...

  8. 汇编:jmp系列跳转指令总结

    助记方法: J:跳转C: 进位位置位N: 否S: 符号位置位o: 溢出位置位Z: 零标志位置位E: 等于P:奇偶位置位A: AboveB: BelowL: Less (Little的比较级)G: Gr ...

  9. WIN7 64位对Excel操作异常

    在本地做Excel导出功能的测试时,报出“检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败”的异常,知道要对Excel进行D ...

  10. openstack RuntimeError: Unable to create a new session key. It is likely that the cache

    [Mon Apr 15 01:02:31.654247 2019] [:error] [pid 19433:tid 139790082479872] Login successful for user ...