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.如果小明 ...
随机推荐
- webpack 样式表抽离成专门的单独文件并且设置版本号
先以下的 css 的处理我们都把 mode 设置为 production. webpack4 开始使用: mini-css-extract-plugin插件, 1-3 的版本可以用: extract- ...
- java 线程方法 ---- wait()
class MyThread5 implements Runnable{ private int flag = 10; @Override public void run() { while (fla ...
- Python 使用python-kafka类库开发kafka生产者&消费者&客户端
使用python-kafka类库开发kafka生产者&消费者&客户端 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- Tableau环图可视化
1.选择"记录数",拖拽两个记录数放入列中,求总和,选择饼图: 2.选择"大小",调整两个饼图的大小: 3.点击第二个总和(行上的),选择“双轴”: 4.点击坐 ...
- 数据库原理 - 序列4 - 事务是如何实现的? - Redo Log解析(续)
> 本文节选自<软件架构设计:大型网站技术架构与业务架构融合之道>第6.4章节. 作者微信公众号:> 架构之道与术.进入后,可以加入书友群,与作者和其他读者进行深入讨论.也可以 ...
- Winserver-默认以管理员运行程序
打开secpol.msc 打开本地安全策略找到安全设置--本地策略--安全选项用户账户控制:以管理员批准模式运行所有管理员---改为禁用保存设置重启电脑
- Failure sending mail: The user or group name 'xxx\xxxx' is not recognized.Mail will not be resent
一批Reporting Service报表的订阅突然报如下错误: Failure sending mail: The user or group name 'xxx\xxxx' is not re ...
- idea中Springcloud同时运行多个模块、微服务
idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的打开Run DashBoard面板 在工程的.idea中找到workspace.xml,并找 ...
- Synchronized的基本知识、实现原理以及其与ReentrantLock的区别
一.synchronized知识 在谈论synchronized之前,我们需要了解线程安全问题的主要诱因.线程安全问题的主要诱因如下: 存在共享数据(也称为临界资源) 存在多条线程共同操作这些共享数据 ...
- 第二章 Python基本图形绘制
2.1 深入理解Python语言 Python语言是通用语言 Python语言是脚本语言 Python语言是开源语言 Python语言是跨平台语言 Python语言是多模型语言 Python的特点与优 ...