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.如果小明 ...
随机推荐
- Android探究之View的绘制流程
Android中Activity是作为应用程序的载体存在,代表着一个完整的用户界面,提供了一个窗口来绘制各种视图,当Activity启动时,我们会通过setContentView方法来设置一个内容视图 ...
- SQL 获取时间段内日期列表
declare @start date,@end date; set @start='2010-01-01'; set @end='2010-02-01'; --获取时间段内日期列表 select [ ...
- git window安装与注册邮箱用户名
1.git window版本下载 https://git-scm.com/downlods 下载完后点击安装包安装,一直下一步就行; 2.验证安装是否成功 在开始菜单里找到“Git”->“Git ...
- Anaconda在Windows上安装不上原因
倒腾了一下午安装Anaconda,[所有程序]中只有一个Anaconda的目录,目录中只有一个anaconda prompt,最后发现是因为环境中原先就安装了Java环境,将之前安装的java环境卸载 ...
- centos 7 selinux开启关闭
1 查看selinux状态 [root@localhost ~]# sestatus SELinux status: disabled 2 关闭 零时关闭 [root@localhost ~]# se ...
- C# -- 使用Parallel并行执行任务
C#:使用Parallel并行执行任务 1. 代码实现 class Program { static void Main(string[] args) { TestParallel(); Consol ...
- html&css学习笔记----YJZJZQA
HTML表单: (
- Python学习案例之Web版语音合成播报
前言 语音合成技术能将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速.音调.音量设置,打破传统文字式人机交互的方式,让人机沟通更自然. 应用场景 将游戏场景中的公告.任务或派单信息通过语音 ...
- Facebook 广告投放相关概念简介(1)
本文不涉及具体代码实现,仅对开发API的前置内容做简单介绍,想参考代码请绕行! 广告主(广告管理工具) ·需要推广自己的应用.网站.主页,所以有了广告管理工具 . ·一个广告主仅可拥有一个广告账户(可 ...
- Python学习步骤如何安排?
一.清楚学习目标 无论是学习什么知识,都要有一个对学习目标的清楚认识. 只有这样才能朝着目标持续前进,少走弯路,从学习中得到不断的提升,享受python学习计划的过程. 二.基本python 知识学习 ...