hdu 4542 "小明系列故事——未知剩余系" (反素数+DFS剪枝)
参考资料:
[1]:https://blog.csdn.net/acdreamers/article/details/25049767
题意:
输入两个数 type , k;
①type = 0,求[1,262]中的因子个数为 k 的反素数,如果求解的答案 > 262,输出"INF";
②type = 1,求使得 num-factor[num] = k 的最小的num;
题解:
只有当 type = 1 时,才有可能输出 "Illegal";
那,什么情况下才会输出呢?
考虑一点,当 num 很大时,num-factor[num]也会随之变大,因为 k 最大为 47777,所以,对于type=1的情况,可以预处理出来;
int vis[maxn];//vis[i]:保存的是num-factor[num]=i的最小的num
void factorTable()//因子表
{
fill(factor,factor+maxn,);
for(int i=;i < maxn;++i)
{
if(factor[i] != )
continue;
for(int j=i;j < maxn;j+=i)
{
int k=;
for(int m=j;m%i == ;m/=i,k++);
factor[j] *= k+;
}
}
mem(vis,INF);//初始为INF
for(int i=;i < maxn;++i)
vis[i-factor[i]]=min(vis[i-factor[i]],i);
}
预处理出1e5前的因子表
那么,当 type = 0 时,就和之前的题一个做法了,不过,需要剪枝才能过;
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define INFull ~0ULL
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=1e5+;
const ll maxV=(1ll*<<)+; int k,type;
int factor[maxn];
int vis[maxn];//vis[i]:保存的是num-factor[num]=i的最小的num
int prime[]={,,,,,,,,,,,,,,,}; void factorTable()//因子表
{
fill(factor,factor+maxn,);
for(int i=;i < maxn;++i)
{
if(factor[i] != )
continue;
for(int j=i;j < maxn;j+=i)
{
int k=;
for(int m=j;m%i == ;m/=i,k++);
factor[j] *= k+;
}
}
mem(vis,INF);//初始为INF
for(int i=;i < maxn;++i)
vis[i-factor[i]]=min(vis[i-factor[i]],i);
}
/**
根据反素数的性质可知:
当前素数的指数要小于等于之前比起小的素数的指数
这就是limit的作用,剪枝1
初始为62(最大为2的62次幂)
*/
void DFS(int dep,int limit,ll curNum,int curK,ll &ans)
{
if(curK == k && curNum < ans)
ans=curNum; for(int i=;i <= limit;++i)
{
//向后遍历,i会增大,如果当前的 curK*(i+1) > k,那么之后的肯定也大于k
if(ans/curNum < prime[dep] || curK*(i+) > k)//剪枝2
break; curNum *= prime[dep];
/**
如果curK*(i+1) = k,那么,势必组成curK的所有的(i+1)都为k的因子
例如:
假设k=(p1+1)*(p2+1)*......*(pn+1)
那么k%(p1+1)=0,k%(p2+1)=0,....,k%(pn+1)=0;
*/
if(k%(curK*(i+)) == )//剪枝3
DFS(dep+,i,curNum,curK*(i+),ans);
}
}
void Solve()
{
if(type)//type = 1
{
if(vis[k] == INF)//判断是否有解
printf("Illegal\n");
else
printf("%d\n",vis[k]);
return ;
}
ll ans=maxV;
DFS(,,,,ans);
if(ans >= maxV)
printf("INF\n");
else
printf("%lld\n",ans);
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
factorTable();
int test;
while(~scanf("%d",&test))
{
for(int i=;i <= test;++i)
{
scanf("%d%d",&type,&k);
printf("Case %d: ",i);
Solve();
}
}
return ;
}
hdu 4542 "小明系列故事——未知剩余系" (反素数+DFS剪枝)的更多相关文章
- hdu 4542 小明系列故事——未知剩余系 反素数 + 打表
小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Prob ...
- hdu 4542 小明系列故事——未知剩余系
小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...
- HDU 4542 小明系列故事——未知剩余系 (数论|反素数)
分析 kuangbin的blog已经讲的很好了,我做一点补充 1.当做x*y>z的比较时,如果x \(\ast\) y过大,可以写成x>z/y 2.分解质因数时选择用f[][0]保存质数, ...
- HDU4542 小明系列故事——未知剩余系
大赞的数论题: 大致思路: 对于TYPE=1的情况,认为 X 中有 X-K个约数,求最小的X,X-K>0 那么化为B+K的约数为B, 我们知道(B+K)的约数<=2*SQRT(B+K);这 ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU 4828 小明系列故事——捉迷藏
漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others) Memo ...
- HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)
Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则: 1.如果小明 ...
随机推荐
- html文档知识补充
13.form表单(*******) 功能:前后数据交互,帮你提交任意的数据 input通过控制type属性来展示不同的获取用户输入的页面效果 type属性总结: text:纯文本 password: ...
- 3.SDL落地方案
01.安全培训 安全意识培训(全员) 邮件安全 钓鱼邮件 邮件伪造 第三方转存 检查发件人 开启二次验证 邮件转发 第三方代收 邮件附件敏感信息加密 病毒防范 什么是木马病毒 我安装哪些杀毒软件? 定 ...
- 如何快速清理 docker 资源
如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察觉的应该是对磁盘空间的占用.本文将介绍如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无 ...
- 使用 prismjs 在网页中高亮显示代码
最近在总结这一年来制作的网页模块,网站风格统一的情况下,网站页面结构不会改变,因此想记录一部分网站中统一的结构,方便日后维护. 用到的相关技术: vue, element-ui, prismjs, v ...
- MongoDB自学(2)
条件操作符: gt(大于),gte(大于等于),lt(小于),lte(小于等于)E.G:db.People.find({age:{$gt:100}})//查找集合里age大于100的文档 注意:str ...
- 黑阔主流攻防之不合理的cookie验证方式
最近博主没事干中(ZIZUOZISHOU),于是拿起某校的习题研究一番,名字很6,叫做黑阔主流攻防习题 虚拟机环境经过一番折腾,配置好后,打开目标地址:192.168.5.155 如图所示 这里看出题 ...
- LeetCode算法题-Self Dividing Numbers(Java实现)
这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...
- windows 和linux 路径解析的区别
windows下使用的是“\”作为分隔符,而linux则反其道而行之使用"/"作为分隔符.所以在windows 环境中获取路径常见 C:\windows\system 的形式,而l ...
- 利用unittest+ddt进行接口测试(一):简单demo
一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向.逆向等多种组合.所以在测试一个接口时通常会编写多条case,而这些case除了传参不同外,其实并没什么区别. 这个时候就可以利用ddt ...
- 在后台业务管理系统中使用Autofac实现微信接口的处理
在后台业务管理系统中使用Autofac实现微信接口的处理,我们只需要把相关使用到的DLL放到BIN目录里面即可,通过IOC控制反转方式实现对接口的调用.在实现在业务系统里面,我们本身程序可能已经依赖了 ...