Luogu P1463 [POI2002][HAOI2007]反素数【数论/dfs】By cellur925
题目描述
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?(N<=2000000000)
$Sol$
首先我们需要知道一个数约数的个数。这个是算术基本定理的推论,这里就不再赘述了,这儿稍微提了一句。
之后因为N在2e9内,所以它至多有10个质因子。
再次,我们要满足质因子从小到大的数量单调不增。为什么呢?当一个质因子比较小时,它就有更强的可塑性去贡献更多的因子。譬如出名要趁早以及当一个选手比你小还比你强你就没办法了这样的意思。
于是我们就可以直接采用$dfs$来维护最大的反素数。最大的反素数一定是相同约数中最小的。因为约数相同时,但是当他更大时,就更有可能出现比他小,约数还比他多的反素数。
代码中几个参量分别是当前质数下标,现在累乘的结果,当前质数出现的次数,上一个质数出现的次数,以及现在总约数个数。注意,当一个素数被完全用尽(开始搜下一质数时),才累计它的个数。
$Code$
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; ll n,ans,num;
ll prime[]={,,,,,,,,,,,,,}; void dfs(int pos,ll mul,ll nowcnt,ll lastcnt,ll allcnt)
{
if(ans==allcnt*(nowcnt+)&&mul<num)
num=mul;
if(allcnt*(nowcnt+)>ans)
ans=allcnt*(nowcnt+),num=mul;
if(nowcnt+<=lastcnt&&mul*prime[pos]<=n)
dfs(pos,mul*prime[pos],nowcnt+,lastcnt,allcnt);
for(int i=pos+;i<=;i++)
if(mul*prime[i]<=n)
dfs(i,mul*prime[i],,nowcnt,allcnt*(nowcnt+));
} int main()
{
scanf("%lld",&n);
dfs(,,,,);
printf("%lld\n",num);
return ;
}
$Others$
其实...本题还可以打表做。我们可以预先搞出所有的反素数,根据范围来得出答案。
但是...这个表最后我还是没完整地打出来(弱)。下面提供打部分表的思路。
/*
---------------Sheet 1 --------------------
#include<cstdio>
#include<algorithm>
#define maxn 500000000 using namespace std; int ans=0;
short a[maxn];//技巧:用short省空间 int main()
{
freopen("1.out","w",stdout);
for(int i=1;i<=maxn-1;i++)
for(int j=i;j<=maxn;j+=i)
a[j]++; for(int i=1;i<=maxn;i++)
if(a[i]>ans)
{
ans=a[i];
printf("%d,",i);
}
printf("\n");
printf("%d",ans);
return 0;
}*/
/*
-----------Sheet 2---------------
#include<cstdio>
#include<algorithm>
#define maxn 1000000001
#define maxpre 500000000 using namespace std; int ans=1152;
short a[maxpre+1]; int main()
{
freopen("1.out","w",stdout);
for(int i=1;i<=maxn-1;i++)
for(int j=(maxpre/i)*i+i;j<=maxn-1;j+=i)
a[j-maxpre]++; for(int i=1;i<=maxpre;i++)
if(a[i]>ans)
{
ans=a[i];
printf("%d,",i+500000000);
}
printf("\n");
printf("%d",ans);
return 0;
}*/
/*-----------Sheet3-------------
#include<cstdio>
#include<algorithm>
#define maxn 1500000001
#define maxpre 1000000000 using namespace std; int ans=1344;
short a[(maxpre>>1)+1]; int main()
{
freopen("1.out","w",stdout);
for(int i=1;i<=maxn-1;i++)
for(int j=(maxpre/i)*i+i;j<=maxn-1;j+=i)
a[j-maxpre]++; for(int i=1;i<=maxpre;i++)
if(a[i]>ans)
{
ans=a[i];
printf("%d,",i+maxpre);
}
printf("\n");
printf("%d",ans);
return 0;
}*/
dabiao
Luogu P1463 [POI2002][HAOI2007]反素数【数论/dfs】By cellur925的更多相关文章
- 洛谷 P1463 [POI2002][HAOI2007]反素数
题目链接 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1, ...
- [POI2002][HAOI2007]反素数 数论 搜索 好题
题目描述: 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4, ...
- 【题解】洛谷P1463 [POI2002][HAOI2007] 反素数(约数个数公式+搜索)
洛谷P1463:https://www.luogu.org/problemnew/show/P1463 思路 约数个数公式 ai为质因数分解的质数的指数 定理: 设m=2a1*3a2*...*pak ...
- BZOJ 1053: [HAOI2007]反素数ant dfs
1053: [HAOI2007]反素数ant 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1053 Description 对于任何正整 ...
- [POI2002][HAOI2007]反素数
题意 反素数 想法 证明这样一个结论 对于一个可行的反素数\(p\) \(p = \sum_{i}^{k} p_{k} ^ {c_k}\) 当 \(p_i > p_j 有 c_i < c_ ...
- 数学结论【p1463】[POI2002][HAOI2007]反素数
Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数 ...
- [POI2002][HAOI2007]反素数(Antiprime)
题目链接 这道题需要用到整数唯一分解定理以及约数个数的计算公式.这里我就不再阐述了. 公式可以看出,只有指数影响约数个数,那么在唯一分解出的乘式中,指数放置的任何位置都是等价的.(即 23*34*57 ...
- 【BZOJ1053】[HAOI2007]反素数 (搜索+数论)
\([POI2002][HAOI2007]\)反素数 题目描述 对于任何正整数x,其约数的个数记作\(g(x)\).例如\(g(1)=1.g(6)=4\). 如果某个正整数x满足:\(g(x)> ...
- bzoj1053: [HAOI2007]反素数ant
51nod有一道类似的题...我至今仍然不会写暴搜!!! #include<cstdio> #include<cstring> #include<iostream> ...
随机推荐
- SQL server 数据库
SQL server 的开启关闭和暂停 数据库表格
- 【转载】.NET Remoting学习笔记(二)激活方式
目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科 ♂风车车.Net 激活方式概念 在访 ...
- oracle死锁解决经常用法(屡试不爽)
--1.查询被锁的情况 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$sessi ...
- Django-权限信息自定义标签
自定义权限标签: import re from django.template import Library from django.conf import settings register = L ...
- Spyder的汉化
我准备写下spyder的汉化问题:对于英文大佬,从来没得汉化问题,但是对于新手和英语差的来说,汉化还是有必要,至少用汉化过得软件能快速掌握软件等.后期会用软件了在慢慢习惯英文也不迟...哈哈哈哈.本文 ...
- const *char p和char const *p
const *char p和char const *p,const char*p的区别 char*const p——p必须初始化,且不能指向别处,即p是指针常量: char const*p——p指向的 ...
- DCOS之Mesos-DNS介绍
DCOS的Mesos-DNS它主要提供域名解析服务,Mesos-DNS 在DCOS框架中支持服务发现,同意应用程序和服务通过域名系统(DNS)来相互定位.DCOS中的 Mesos-DNS充当的角色和在 ...
- collection 模块 双端队列
单端队列 用于同一进程中的队列,可以叫做单进程队列. queue 遵循先进先出,先进去的必须先出来 1.先进先出: impore queue q = queue.Queue() 实例化一个对象 q.p ...
- powerdesigner 导入mysql数据库(步骤及注意点)
参考博客 PowerDesigner中导入MYSQL数据库结构的步骤 mysql ODBC 在64位下提示找不到odbc驱动问题 PowerDesigner逆向工程导入MYSQL数据库总结
- Linux时间子系统之三:时间的维护者:timekeeper【转】
本文转载自:http://blog.csdn.net/droidphone/article/details/7989566 本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内 ...