Painful Bases LightOJ - 1021
题意:给出0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F中的一些字符(不重复)还有一个进制base,求这些字符的排列形成的base进制数中,有多少个能被k整除。
方法:
正常的做法:
http://blog.csdn.net/chenzhenyu123456/article/details/51155038
自己的做法(常数很大,仅做记录):
ans[i][S][j]表示i进制下,S集合中数字可用,总产生余数为j时方案数
digit(S)表示S集合中元素数量。那么,当前数字为一个digit(S)位的base进制数,其第digit(S)位的值转换为10进制后除以k产生的余数就是j。
ans[i][S][j]=sum{ans[i][S-p][(j+k-pow(i,digit(S)-1)*p%k)%k}
其含义:把S中任意一个数字p当做首位,首位产生的余数$pow(i,digit(S)-1)*p%k$,然后剩下数字的余数应该是$(j+k-pow(i,digit(S)-1)*p%k)%k$。
实际使用时,这样定义状态会爆空间,因此只能把i的一维舍去,每组数据都重新算。
错误次数:2
原因:
1.用循环,被卡常,改成了记忆化搜索。
2.在用循环的时候,为了卡常,改了循环内外层,但不正确。
卡常记录:把记录a^b改成记录所有a^b%k,时间缩短到1/3。
#include<cstdio>
#include<cstring>
typedef long long LL;
LL ans[][];
LL T,TT;
bool ok[];
char ss[];
LL popcount[];
LL powww[][][];
LL base,k;
LL poww(LL a,LL b)
{
if(powww[a][b][k]) return powww[a][b][k];
LL base=a,ans=,b1=b;
while(b)
{
if(b&) ans=ans*base%k;
b>>=;
base=base*base%k;
}
return powww[a][b1][k]=ans;
}
LL get(LL s,LL j)
{
if(ans[s][j]!=-) return ans[s][j];
int j1;
ans[s][j]=;
for(j1=;j1<base;j1++)
if(s&(<<j1))
ans[s][j]+=get(s^(<<j1),(j+k-poww(base,__builtin_popcount(s)-)*j1%k)%k);
return ans[s][j];
}
int main()
{
LL i,tt;
for(i=;i<(<<);i++)
popcount[i]=__builtin_popcountll(i);
scanf("%lld",&T);
for(TT=;TT<=T;TT++)
{
tt=;
memset(ok,,sizeof(ok));
memset(ans,-,sizeof(ans));
scanf("%lld%lld",&base,&k);
ans[][]=;
scanf("%s",ss);
for(i=;i<strlen(ss);i++)
if(ss[i]>=''&&ss[i]<='')
ok[ss[i]-'']=;
else
ok[ss[i]-'A'+]=;
for(i=;i<base;i++)
if(ok[i])
tt^=(<<i);
printf("Case %lld: %lld\n",TT,get(tt,));
}
return ;
}
Painful Bases LightOJ - 1021的更多相关文章
- K - Painful Bases 状压dp
Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...
- 1021 - Painful Bases
1021 - Painful Bases PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB As ...
- lightoj 1021 - Painful Bases 状态压缩
题目链接:http://lightoj.com/volume_showproblem.php?problem=1021 #include<cstring> #include<cstd ...
- lightoj 1021 - Painful Bases(数位dp+状压)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021 题解:简单的数位dp由于总共就只有16个存储一下状态就行了.求各种进制能 ...
- Light OJ 1021 - Painful Bases(状态压缩DP)
题目大意: 给你一个base 进制的数字,把这个数字的每一位进行全排列,问有多少个数字是可以整除k的. 题目解析: #include<cstdio> #include<cstring ...
- Light oj 1021 - Painful Bases
题意: 给一个B进制的数,一个10进制的数K,B进制数有x位, 对着x位进行全排列的话,有x!种可能, 问这x!的可能中,有多少种可以整除K,各个位置上的数字都不同. 思路:状态压缩,数位DP #i ...
- LightOJ1021 Painful Bases(状压DP)
容易想到状态dp[n][S][m](S是数字出现的集合),表示前n位用了数字集S且模k余数是m的方案数. 利用 (xy)base % k = ( x*base+y ) % k = (( x%k ) * ...
- lightoj 1021 (数位DP)
题意:给你一个b进制的数,再给你一个十进制数k,你可以重新排列b进制数的每一位得到其他b进制数,问你这些数中有多少可以整除k? 思路:数位dp. #include <cstdio> #in ...
- Lightoj 1021【状压DP(未搞)】
状态压缩一下,然后DP还是很容易想到,dp[i][j]表示状态为i时,模 k 为 j 的排列数的个数,然后每次对一个状态扩展,添加新的数字: 然而那个取膜没懂.....
随机推荐
- 【C语言】统计数字在排序数组中出现的次数
//数字在排序数组中出现的次数. //统计一个数字在排序数组中出现的次数.比如:排序数组{1,2,3,3,3,3,4,5}和数字3,因为3出现了4次,因此输出4. #include <stdio ...
- Direct3D 9 入门样例程序 圆锥体
介绍 Directx3D 9 什么是DirectX,非常好说了,Win32 C++ API.主要是多媒体编程方面的,长处体如今高性能了,如今我知道的版本号最高是D3D11,可是我是学习入门的,从D3D ...
- XML复习笔记(复习资料为菜鸟教程里的XML教程)
XML 指可扩展标记语言(eXtensible Markup Language) XML 的设计宗旨是传输数据,而不是显示数据. XML 标签没有被预定义.您需要自行定义标签. XML 被设计为具有自 ...
- Ehcache CacheManager
CacheManager是Ehcache框架的核心类和入口,它负责管理一个或多个Cache对象.要使用Ehcache框架,必须要先创建 CacheManager 对象.现在我们学习下,如何创建 Cac ...
- Record is locked by another user
Oracle修改表中记录时出现record is locked by another user的问题 在操作表时没有commit,导致表被锁,只要执行下面两行语句,就可以了将行锁解锁了. Select ...
- 解析腾讯企业邮箱到自己域名,设置mail的cname
之前注册了腾讯企业邮的免费邮箱,后来想把企业邮箱和域名绑定起来,发现了一些问题. 先来看正常的部分,假设你已经注册过了腾讯企业邮箱免费版,并且已经绑定好了域名. 然后在域名提供商那里设置域名解析的MX ...
- umask文件屏蔽字的使用【学习笔记】
#include "apue.h" #include <fcntl.h> #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP ...
- HDU2181 哈密顿绕行世界问题 —— DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...
- 探讨Ajax中有关readyState(状态值)和status(状态码)的问题
先看下面一段代码,然后给大家详细介绍,Ajax中有关readyState(状态值)和status(状态码)的问题,具体内容如下所示: var getXmlHttpRequest = function ...
- 皮尔逊相关系数的java实现
相关系数的值介于–1与+1之间,即–1≤r≤+1.其性质如下:当r>0时,表示两变量正相关,r<0时,两变量为负相关.当|r|=1时,表示两变量为完全线性相关,即为函数关系.当r=0时,表 ...