首页 > 其他分享 >反素数深度分析

反素数深度分析

时间:2023-05-31 15:02:39浏览次数:48  
标签:分析 tmp int 深度 素数 num ULL ans include


今天要我要讲的是反素数,在ACM中也算是常见的考点,那么对于搞ACM的同学来说,很有必要搞清楚它,所以接下

来我会很详细地讲解。


在讲解反素数之前,我们先来看反素数的概念。


反素数的定义:对于任何正整数

反素数深度分析_i++

,其约数个数记为

反素数深度分析_#include_02

,例如

反素数深度分析_#include_03

,如果某个正整数

反素数深度分析_i++

满足:对任意的正整            数

反素数深度分析_约数个数_05

,都有

反素数深度分析_i++_06

,那么称

反素数深度分析_i++

为反素数。


从反素数的定义中可以看出两个性质:


(1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为

反素数深度分析_约数个数_08

的这个数

反素数深度分析_i++

尽量小(2)同样的道理,如果

反素数深度分析_约数个数_10

,那么必有

反素数深度分析_#include_11



在ACM竞赛中,最常见的问题如下:


(1)给定一个数

反素数深度分析_i++

,求一个最小的正整数

反素数深度分析_约数个数_08

,使得

反素数深度分析_约数个数_08

的约数个数为

反素数深度分析_i++

(2)求出

反素数深度分析_约数个数_16

中约数个数最多的这个数


从上面的性质中可以看出,我们要求最小的

反素数深度分析_约数个数_08

,它的约数个数为

反素数深度分析_i++

,那么可以利用搜索来解。


以前我们求一个数的所有因子也是用搜索,比如

反素数深度分析_#include_19

,以每一个

反素数深度分析_约数个数_20

为树的一层建立搜索树,深度为

反素数深度分析_约数个数_21


反素数深度分析_约数个数_22

为例进行说明,建树如下:


反素数深度分析_i++_23


可以看出从根节点到每一个叶子结点这条路径上的所有数字乘起来都是12的约数,所以12有6个约数。


搜索的思路就明显了,从根节点开始进行深搜,到叶子结点,代码如下:

void dfs(int dept,LL ans = 1)
{
    if(dept == cnt)
    {
        fac[ct++] = ans;
        return;
    }
    for(int i=0;i<=num[dept];i++)
    {
        dfs(dept+1,ans);
        ans *= pri[dept];
    }
}

回到我们的问题,同样用搜索来求最小的

反素数深度分析_约数个数_08



题目:http://codeforces.com/problemset/problem/27/E

 

题意:给一个数

反素数深度分析_i++

,求一个最小的正整数,使得它的因子个数为

反素数深度分析_i++


 

分析:与求因子的方法类似,先建立搜索树,以每一个

反素数深度分析_约数个数_20

为一层建立树型结构,进行搜索,取最小的。


#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
typedef unsigned long long ULL;
const ULL INF = ~0ULL;

int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};

int n;
ULL ans;

void dfs(int dept,ULL tmp,int num)
{
    if(num > n) return;
    if(num == n && ans > tmp) ans = tmp;
    for(int i=1;i<=63;i++)
    {
        if(ans / p[dept] < tmp) break;
        dfs(dept+1,tmp *= p[dept],num*(i+1));
    }
}

int main()
{
    while(cin>>n)
    {
        ans = INF;
        dfs(0,1,1);
        cout<<ans<<endl;
    }
    return 0;
}

 

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1562

 

题意:

反素数深度分析_i++

以内的因子最多的那个数。

分析:基本上跟上题差不多。


代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
typedef unsigned long long ULL;
const ULL INF = ~0ULL;

int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};

ULL ans,n;
int best;

void dfs(int dept,ULL tmp,int num)
{
    //到叶子结点,返回
    if(dept >= 16) return;
    //num记录的因子个数,如果遇到更小的,就更新
    if(num > best)
    {
        best = num;
        ans = tmp;
    }
    //当因子个数相同时,取值最小的
    if(num == best && ans > tmp) ans = tmp;
    for(int i=1;i<=63;i++)
    {
        if(n / p[dept] < tmp) break;
        dfs(dept+1,tmp *= p[dept],num*(i+1));
    }
}

int main()
{
    while(cin>>n)
    {
        ans = INF;
        best = 0;
        dfs(0,1,1);
        cout<<ans<<endl;
    }
    return 0;
}

 

题目:http://acm.timus.ru/problem.aspx?space=1&num=1748

 

分析:这道题主要注意数据处理。对于上面的两题,数据范围小,所以可以不用剪枝,本题就需要了。

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
typedef unsigned long long ULL;
const ULL INF = ~0ULL;

int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};

ULL ans,n;
int best;

void dfs(int dept,int limit,ULL tmp,int num)
{
    if(tmp > n) return;
    if(num > best)
    {
        best = num;
        ans = tmp;
    }
    if(num == best && ans > tmp) ans = tmp;
    for(int i=1;i<=limit;i++)
    {
        double cur = (double)tmp;
        if(n < cur*p[dept]) break;
        dfs(dept+1,i,tmp *= p[dept],num*(i+1));
    }
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        ans = INF;
        best = 0;
        dfs(0,60,1,1);
        cout<<ans<<" "<<best<<endl;
    }
    return 0;
}

 

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542

 

题意:

   给出一个数K和两个操作

    如果操作是0,就求出一个最小的正整数X,满足X的约数个数为K。

    如果操作是1,就求出一个最小的X,满足X的约数个数为X-K。


分析:对于操作0,就是求反素数,直接搜索搞定。对于操作1,代表1至X中不是X的约数个数为K。


代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N = 50005;
typedef long long LL;
const LL INF = (((LL)1)<<62)+1;

int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};

LL ans;
int n;
int d[N];

void Init()
{
    for(int i=1;i<N;i++) d[i] = i;
    for(int i=1;i<N;i++)
    {
        for(int j=i;j<N;j+=i) d[j]--;
        if(!d[d[i]]) d[d[i]] = i;
        d[i] = 0;
    }
}

void dfs(int dept,int limit,LL tmp,int num)
{
    if(num > n) return;
    if(num == n && ans > tmp) ans = tmp;
    for(int i=1;i<=limit;i++)
    {
        if(ans / p[dept] < tmp || num*(i+1) > n) break;
        tmp *= p[dept];
        if(n % (num*(i+1)) == 0)
            dfs(dept+1,i,tmp,num*(i+1));
    }
}

int main()
{
    Init();
    int T,tt=1;
    scanf("%d",&T);
    while(T--)
    {
        int type;
        scanf("%d%d",&type,&n);
        if(type) ans = d[n];
        else
        {
            ans = INF;
            dfs(0,62,1,1);
        }
        printf("Case %d: ",tt++);
        if(ans == 0) puts("Illegal");
        else if(ans >= INF) puts("INF");
        else printf("%I64d\n",ans);
    }
    return 0;
}

 

标签:分析,tmp,int,深度,素数,num,ULL,ans,include
From: https://blog.51cto.com/u_16146153/6386938

相关文章

  • nc这个工具用于伪造c2服务器 做c2初始连接的抓包分析实在是太tm好用了!必要时候配合APA
    DNSSpoofingwithAPATEDNS20thFebruary2015Wannes.ColmanLeaveacommentIfyou quicklywanttofindoutwhatthemalwareinyoursandboxisresolving,youcanuseApateDNS.ThisfreetoolwilllistenforoutgoingDNSrequestsandisabletospoofthe......
  • lucene源码分析的一些资料
    针对lucene6.1较新的分析:http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/conansonic/article/details/51849659老的:AnnotatedLucene(源码剖析中文版)Lucene原理与代码分析完整版  ......
  • 开源软件架构总结之——Bash(readline做输入交互式,词法语法分析,进程交互)
    第3章TheBourne-AgainShellBash的主要组件:输入处理,解析,单词展开(wordexpansion)和其他命令处理,管道(pipeline)中的命令执行。这些组件构成一个流水线(pipeline),从键盘或脚本中获取字符,然后逐步转化为命令。图3.1Bash组件结构 3.7.经验教训3.7.1.什么是重要的参与到Bash项目......
  • wireshark分析tcp传输之文件上传速率问题
    在网络性能问题排查思路那一节里,我提到了查看系统网络瓶颈的方法以及排查丢包问题的手段。但就此分析网络问题还不够精细,有时网络资源并没有达到瓶颈,或者并没有丢包产生,但是网络传输速率就是很慢,或者有丢包产生,但无法知道丢包的详细过程,无法知道整个tcp传输过程的具体情况。如何......
  • 关于数据和处理器位宽不匹配导致的数据跳变问题分析
    关于数据和处理器位宽不匹配导致的数据跳变问题分析本问题来源于2023.5.31上海创景工程师所作讲座,仅作记录,用于参考。问题情景一个64位的数据(类似时钟,不断变化),在输入到32位处理器进行处理后,发现输出的数据并不和输入数据匹配,即出现跳变。错误分析32位处理器可以处理64位......
  • 【grpc】记一次jmeter压测响应超时分析
    一、场景  由于jmeter测试时,接口存在超时问题,所以就需要分析超时的原因 二、抓包我们需要把分析数据抓下来->%sudotcpdump-ieth0host192.168.3.123andport6788-wcapture.pcaptcpdump:listeningoneth0,link-typeEN10MB(Ethernet),capturesize2621......
  • 会流程图却不会UML活动图?活动图深度剖析,就怕你学不会!
    1.UML活动图是啥?也许很多人都不怎么了解活动图,但是却对流程图很熟悉,你暂且可以简单的把活动图理解为UML里的流程图,用来描述系统的行为特征。不过UML活动图对比于流程图来说也存在不少差异,本文将在第三章节讲解活动图与流程图和其他相关类型绘图之间的区别。活动图是用于描述系......
  • wukong引擎源码分析之索引——part 1 倒排列表本质是有序数组存储
    searcher.IndexDocument(0,types.DocumentIndexData{Content:"此次百度收购将成中国互联网最大并购"})engine.go中的源码实现://将文档加入索引////输入参数://docId标识文档编号,必须唯一//data见DocumentIndexData注释////注意://1.这个函数是线程安全......
  • 基于ResNet18深度学习网络的mnist手写数字数据库识别matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要ResNet系列网络,图像分类领域的知名算法,经久不衰,历久弥新,直到今天依旧具有广泛的研究意义和应用场景。被业界各种改进,经常用于图像识别任务。ResNet-18,数字代表的是网络的深度,也就是说ResNet18网络就是18层的吗?实......
  • 基于ResNet18深度学习网络的mnist手写数字数据库识别matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要        ResNet系列网络,图像分类领域的知名算法,经久不衰,历久弥新,直到今天依旧具有广泛的研究意义和应用场景。被业界各种改进,经常用于图像识别任务。ResNet-18,数字代表的是网络的深度,也就......