P1463 [SDOI2005]反素数ant

P1463 [SDOI2005]反素数ant

题目描述

对于任何正整数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(1<=N<=2,000,000,000)。

输出格式:

不超过N的最大的反质数。

输入输出样例

输入样例#1:

1000

输出样例#1:

840

一道水题 就是找最大的反素数 

我们先建一棵搜索树 以12为例 从根节点到每个叶子节点路径上的数乘起来就是12的约数 我们可以按照这个思路来找反素数 具体解释见代码

这个题n<=2*10^9 不会超过int log2(2*10^9)大约在30左右 所以我们每一个素数最多递归30层 记录当前到了第几个素数 这个素数用了几遍 产生几个约数 当前的now是多少
 1 #pragma GCC optimize(2)
 2 #include <cstdio>
 3 #include <cctype>
 4
 5 typedef long long LL;
 6
 7 LL ans;
 8
 9 #define Inline __attri10 bute__( ( optimize( "-O2" ) ) )
11
12 int n,Now;
13
14 int prime[20]={0,2,3,5,7,11,13,17,19,23,29};
15
16 Inline void DFS(int num,int Np,LL now) {
17     if(now>n) return;//如果当前数now大于n 就返回 最优性剪枝
18     if(Np>Now||Np==Now&&now<ans) {Now=Np;ans=now;}
19         //    如果当前约数个数大于目前全局最优解 或者约数个数等于全局最优解但是当前数要大于目前全局最优解 就更新
20     LL t=1,s=0;// s为当前素数使用了几次 t则就是当前素数使用了s次产生的约数
21     for(int i=1;i<=30;++i) {
22         t*=prime[num];
23         ++s;
24         if(now*t>n) return;// 当前数now乘约数t产生的数大于n 说明当前搜索方向无法产生解
25         DFS(num+1,Np*(s+1),now*t);
26     }
27 }
28
29 int hh() {
30     scanf("%d",&n);
31     DFS(1,1,1);
32     printf("%lld\n",ans);
33 }
34
35 int sb=hh();
36 int main(int argc,char**argv) {;}
 
时间: 2024-11-06 06:52:21

P1463 [SDOI2005]反素数ant的相关文章

洛谷 P1463 [SDOI2005]反素数ant

P1463 [SDOI2005]反素数ant 题目描述 对于任何正整数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(1<=N<=2,000,000,000). 输出格式: 不超过N的最大的反质数. 输入输出样例 输入样例#1: 1000 输出样例#1: 840思

洛谷 P1463 [SDOI2005]反素数ant &amp;&amp; codevs2912反素数

题目描述 对于任何正整数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(1<=N<=2,000,000,000). 输出格式: 不超过N的最大的反质数. 输入样例#1: 1000 输出样例#1: 840 这道题很明显要找到的是不大于n的约数数最多的数里面最小的因为

Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】

题目链接:https://www.luogu.org/problemnew/show/P1463 题意: 对于任何正整数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

[SDOI2005]反素数ant

题目描述 对于任何正整数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(1<=N<=2,000,000,000). 输出格式: 不超过N的最大的反质数. 输入输出样例 输入样例#1: 1000 输出样例#1: 840 根据整数的唯一分解定理,每个反素数都可以分解为

【BZOJ 1053】 1053: [HAOI2007]反素数ant (反素数)

1053: [HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么 ? Input 一个数N(1<=N<=2,000,000,000). Output 不超过N的最大的反质数. Sample Input 1000 Sample Output

[BZOJ 1053] [HAOI 2007]反素数ant

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1857  Solved: 1034[Submit][Status][Discuss] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么?

【BZOJ】1053: [HAOI2007]反素数ant

1053: [HAOI2007]反素数ant Description: g(x)表示x的约数个数,反素数:对于任意的i (i < x),均有g(i) < g(x),则x为反素数:现在输入不超过2e9的数,要你找出不超过N的最大的反素数: 坑点:里面的反素数是严格小于,所以对于相同的约数要取较小的. 思路:直接深搜外加剪枝即可: #include<iostream> #include<cstdio> #include<cstring> #include<

[HAOI2007]反素数ant

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1907  Solved: 1069[Submit][Status][Discuss] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么?

bzoj 1053: [HAOI2007]反素数ant 搜索

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1497  Solved: 821[Submit][Status] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个数N