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> ...
随机推荐
- 走入asp.net mvc不归路:[6]linq常见用法
asp.net mvc结合linq,先不说性能问题,对于增删查改的操作还是相当方便的.以下我们就来介绍一下linq在asp.net mvc的Controller中的常见用法. 1 首先来看看整个数据表 ...
- Android 特别大的Activity和Fragment的生命周期图
这么 这么大的图.不做太多解释,哈哈,真的是棒棒的. 代码測试下载:http://download.csdn.net/detail/pcaxb/8906085
- Intel processor brand names-Xeon,Core,Pentium,Celeron----Quark
http://en.wikipedia.org/wiki/Intel_Quark Intel Quark From Wikipedia, the free encyclopedia Intel ...
- Codeforces Round #253 (Div. 2)——Borya and Hanabi
题目连接 题意: n表示有n个卡片.每一个卡片有一种颜色和一个数字(共五种不同的颜色和五个不同的数字). 事先知道每种卡片有几张.可是不知道详细的位置. 问须要几次提示就能够知道全部卡片的位置都在哪里 ...
- 登录日志的访问日志的 统计 MapReduce
登录日志的访问日志的 统计 MapReduce <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-commo ...
- 关于npm的环境变量配置、prefix
1.关于npm 的 prefix 在npm中安装全局文件时,npm会把他安装在npm里面配置的prefix路径下,查看prefix的方法是:npm config list/npm config ls/ ...
- 序列化FastReport,重要提示少走弯路 good
原本在开发一个报表插件,因为需要远程传输,因此需要序列化报表,序列化FastReport有两种方式, 1.仅序列化数据,由客户端接受到数据,并呈现报表,这种方式需要在客户端存储报表格式文件xxx.Fr ...
- CentOS7.2安装Vim8和YouCompleteMe
1.环境 本文使用VMWare虚拟机进行实验,客户机系统是CentOS 7.2最小安装(CentOS-7-x86_64-Minimal-1511.iso) 最终实现效果:安装vim8 + python ...
- POJ2243 Knight Moves —— A*算法
题目链接:http://poj.org/problem?id=2243 Knight Moves Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- SPOJ_705_New Distinct Substrings_后缀数组
SPOJ_705_New Distinct Substrings_后缀数组 题意: 给定一个字符串,求该字符串含有的本质不同的子串数量. 后缀数组的一个小应用. 考虑每个后缀的贡献,如果不要求本质不同 ...