传送门

参考资料:

  [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剪枝)的更多相关文章

  1. hdu 4542 小明系列故事——未知剩余系 反素数 + 打表

    小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Prob ...

  2. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

  3. HDU 4542 小明系列故事——未知剩余系 (数论|反素数)

    分析 kuangbin的blog已经讲的很好了,我做一点补充 1.当做x*y>z的比较时,如果x \(\ast\) y过大,可以写成x>z/y 2.分解质因数时选择用f[][0]保存质数, ...

  4. HDU4542 小明系列故事——未知剩余系

    大赞的数论题: 大致思路: 对于TYPE=1的情况,认为 X 中有 X-K个约数,求最小的X,X-K>0 那么化为B+K的约数为B, 我们知道(B+K)的约数<=2*SQRT(B+K);这 ...

  5. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  7. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  8. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  9. HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)

    Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则:  1.如果小明 ...

随机推荐

  1. webpack 样式表抽离成专门的单独文件并且设置版本号

    先以下的 css 的处理我们都把 mode 设置为 production. webpack4 开始使用: mini-css-extract-plugin插件, 1-3 的版本可以用: extract- ...

  2. java 线程方法 ---- wait()

    class MyThread5 implements Runnable{ private int flag = 10; @Override public void run() { while (fla ...

  3. Python 使用python-kafka类库开发kafka生产者&消费者&客户端

    使用python-kafka类库开发kafka生产者&消费者&客户端   By: 授客 QQ:1033553122       1.测试环境 python 3.4 zookeeper- ...

  4. Tableau环图可视化

    1.选择"记录数",拖拽两个记录数放入列中,求总和,选择饼图: 2.选择"大小",调整两个饼图的大小: 3.点击第二个总和(行上的),选择“双轴”: 4.点击坐 ...

  5. 数据库原理 - 序列4 - 事务是如何实现的? - Redo Log解析(续)

    > 本文节选自<软件架构设计:大型网站技术架构与业务架构融合之道>第6.4章节. 作者微信公众号:> 架构之道与术.进入后,可以加入书友群,与作者和其他读者进行深入讨论.也可以 ...

  6. Winserver-默认以管理员运行程序

    打开secpol.msc 打开本地安全策略找到安全设置--本地策略--安全选项用户账户控制:以管理员批准模式运行所有管理员---改为禁用保存设置重启电脑

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

  8. idea中Springcloud同时运行多个模块、微服务

    idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的打开Run DashBoard面板 在工程的.idea中找到workspace.xml,并找 ...

  9. Synchronized的基本知识、实现原理以及其与ReentrantLock的区别

    一.synchronized知识 在谈论synchronized之前,我们需要了解线程安全问题的主要诱因.线程安全问题的主要诱因如下: 存在共享数据(也称为临界资源) 存在多条线程共同操作这些共享数据 ...

  10. 第二章 Python基本图形绘制

    2.1 深入理解Python语言 Python语言是通用语言 Python语言是脚本语言 Python语言是开源语言 Python语言是跨平台语言 Python语言是多模型语言 Python的特点与优 ...