博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】
阅读量:5101 次
发布时间:2019-06-13

本文共 1157 字,大约阅读时间需要 3 分钟。

题目链接:

题意:

  对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

  如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

  现在给定一个数N,你能求出不超过N的最大的反质数么?

 

题解:

  对于一个反素数p有两个结论:

    若将p表示为 ∏(a[i]^k[i])的形式,其中a[i]为质因子,k[i]为指数。

    (1)a[i]为从2开始的连续质数:2,3,5,7...

    (2)k[i]为不升序列:k[1]>=k[2]>=...k[x]

  证明:

    结论1:

      因为一个数x的因子个数 = ∏(k[i]+1)

      所以当两个数的k[i]序列完全相同时,a[i]为从2开始的连续质数的那个数字更小。

      所以另一个数一定不是反素数。

    结论2:

      若两个数的k[i]序列的元素相同(如{1,1,2}和{1,2,1}相同)

      由结论1可知,两个数的a[i]序列完全相同(都是从2开始的连续质数)

      所以k[i]为不升序列的那个数一定更小。

      所以另一个数一定不是反素数。

 

  那么就可以爆搜了。

  在保证a[i]为从2开始连续质数,且k[i]不升的前提下,枚举n以内所有可能是反素数的数。

  在枚举出的所有数中,答案为因子个数最多的那个数。

  若有因子相同的多个数,则选最小的那个数。

 

AC Code:

1 #include 
2 #include
3 #include
4 #define INF 1000000000 5 6 using namespace std; 7 8 const int p[]={
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; 9 10 long long n;11 long long ans=0;12 long long now=0;13 14 void dfs(int x,int lst,long long tot,long long v)15 {16 if(tot>now || (tot==now && v
>n;28 dfs(0,INF,1,1);29 cout<
<

 

转载于:https://www.cnblogs.com/Leohh/p/8391565.html

你可能感兴趣的文章
Window7上搭建symfony开发环境(PEAR)
查看>>
ResolveUrl的用法
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
【转载】基于vw等viewport视区相对单位的响应式排版和布局
查看>>
<转>关于MFC的多线程类 CSemaphore,CMutex,CCriticalSection,CEvent
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
backgound-attachment属性学习
查看>>
个人作业——关于K米的产品案例分析
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
java web 中base64传输的坑
查看>>