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.如果小明 ...
随机推荐
- springboot2.0拦截器和webconfigure配置
接下来介绍一下springboot如何配置拦截器,很简单,只需要两个配置文件就可以了 首先配置登陆拦截器 @Component public class LoginInterceptor implem ...
- Java初学习-常见单词
implements 实行/实现 用于实现接口(interface) extends 延伸/扩展 用于类的继承 container 容 ...
- Python笔记-高级特性
1.迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 如果要迭代value,可以用for value in d ...
- gitbook 入门教程之主题插件
主题插件 目前 gitbook 提供三类文档: Book 文档,API 文档和 FAQ 文档. 其中,默认的也是最常使用的就是 Book 文档,如果想要了解其他两种文档模式,需要引入相应的主题插件. ...
- 【Docker笔记】-开启TCP管理端口
如果我们通过docker来整合spring cloud项目,可以通过maven-docker插件将构建好的镜像直接推送到docker服务器上,但是生产环境建议关闭该功能,为了安全考虑.开启tcp远程监 ...
- kali的网络服务
1.启动Apache: service apache2 start 关闭: service apache2 stop 将Apache2服务添加到自动启动的程序组里: update-rc.d apach ...
- Elimination Game题解
Elimination Game 这道题目出于leetcode,题目虽然很简单但是很有趣,因为有趣才能称得上游戏吧! 0x00 题目介绍 简单介绍一下题目意思 给定一个数字N(N>0),一个列表 ...
- 配置安全的管理访问(GNS3)
实验拓扑: 实验目的: 尝试用R2/R3远程登陆R1路由器并进行管理,在此之前先在R1配置安全的管理访问 1.端口IP配置 R1: e1/0 192.168.1.1/24 e1/1 192.168.2 ...
- zabbix proxy
ProxyMode=0 Server=zabbix-server的IPHostname=zabbix proxy(跟在zabbixWED网页建立代理proxies名称一样) LogFile=/data ...
- 在Winform开发框架中对附件文件进行集中归档处理
在我们Winform开发中,往往需要涉及到附件的统一管理,因此我倾向于把它们独立出来作为一个附件管理模块,这样各个模块都可以使用这个附件管理模块,更好的实现模块重用的目的.在涉及附件管理的场景中,一个 ...