【SCOI2003】巴蜀1088 Antiprime数

2023-11-07 21:08
文章标签 巴蜀 1088 scoi2003 antiprime

本文主要是介绍【SCOI2003】巴蜀1088 Antiprime数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description
  如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数。譬如:1,
2, 4, 6, 12, 24。   任务:编一个程序:
    1、从ANT.IN中读入自然数n。
    2、计算不大于n的最大Antiprime数。
    3、将结果输出到ANT.OUT中。 Input   输入只有一个整数,n(1 <= n <= 2 000 000 000)。 Output   输出只包含一个整数,即不大于n的最大Antiprime数。

首先问题可以转化成求n以内约数最多的数,约数相同则取小的。
一个数x=a1^p1* a2^p2* …* an^pn(a是质数)的约数个数为(p1+1)* (p2+1)* …* (pn+1)。
考虑到2* 3* 5* 7* 11* 13* 17* 19* 23* 27>2e9,可以将27之前的素数打表,之后搜索每个素数的次数即可。
显然可以得到这个剪枝:从2向后,每个素数的指数单调不增。从而也有一个推论,就是不能跳着取素数。这样运行速度就很快了。

#include<cstdio>
#include<cstring>
int p[]={0,2,3,5,7,11,13,17,19,23,0},m,best;
long long n,ans;
void dfs(long long x,int k,int mx,long long now)
{if (now>best||(now==best&&x<ans)){ans=x;best=now;}if (!p[k]) return;int cnt=1;for (x*=p[k];x<=n&&cnt<=mx;x*=p[k],cnt++)dfs(x,k+1,cnt,now*(cnt+1));
}
int main()
{scanf("%lld",&n);dfs(1,1,1e8,1);printf("%d\n",ans);
}

这篇关于【SCOI2003】巴蜀1088 Antiprime数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366286

相关文章

滑雪 POJ 1088

回溯 + DFS #include<cstdio>#include<cstring>#include<iostream>using namespace std;#define MAXD 100 + 10int R,C;int G[MAXD][MAXD];int d[MAXD][MAXD] = {0}; /*到达 i j 时候的最大长度*/int max_size = 0;#

搜索学习(1)--POJ 1088滑雪 NYOJ 10

题目链接:   poj:click here.   NYOJ :click here 搜索的经典,记忆化搜索,可以用dp实现, 思路:做了一天了,关键在于记录路径的二维数组和存储图的数组,当前点四个方向都搜一遍,搜了一遍记录被访问了,高度下降才是符合要求,同时最长路径在搜的同时及时更新, 调了好几遍,搜索题目还是发现没能把图抽象化语言去实现,以后要加强,不过发现nyoj能过,同样的代码交到

寒假第五天--递推递归--三国佚事——巴蜀之危

三国佚事——巴蜀之危 Time Limit: 1000MS Memory limit: 65536K 题目描述 话说天下大势,分久必合,合久必分。。。却道那魏蜀吴三国鼎力之时,多少英雄豪杰以热血谱写那千古之绝唱。古人诚不我欺,确是应了那句“一将功成万骨枯”。  是夜,明月高悬。诸葛丞相轻摇羽扇,一脸愁苦。原来是日前蜀国战事吃紧,丞相彻夜未眠,奋笔急书,于每个烽火台写下安排书

POJ 1088 DP || 记忆化搜索

按高度从小到大排序一遍   DP即可: #include "stdio.h"#include "string.h"#include "queue"#include "algorithm"using namespace std;int dir[4][2]={1,0,-1,0,0,1,0,-1};int n,m,Min,ans;int a[101][101],dp[101][1

POJ-1088 滑雪 记忆化搜索

题目链接 #include <stdio.h>#include <string.h>#include <iostream>#include<functional>#include <queue>#include <string>#include <algorithm>using namespace std;const int maxn = 105;int n,m;i

POJ-1088-动规-DFS+记忆化搜索

/*转载请注明出处:乄心-小黄豆http://blog.csdn.net/wuxinxiaohuangdou*/ 中文的就不解释了! 简单的DFS+记忆搜索! /*336K 79MS AC*/#include<iostream>using namespace std;#define MAX 105int R,C;int max_len[MAX][MAX];int fina_ma

【DFS】poj 1088 滑雪

滑雪 Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 76064 Accepted: 28203 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长

lighoj 1088 Points in Segments | 二分

题意: 给你n个数,q个区间。让你求出每个区间所包含的数的个数。 思路: 一开始以为是线段树,不过看看数据范围,算了。。。 把n个数sort一遍,然后根据每个区间的两个边值进行二分,得出的结果相减即可。注意细节。 AC代码: #include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#in

POJ 题目1088 滑雪(记忆搜索)

滑雪 Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 67994Accepted: 25014 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最

HDU 1088 Write a simple HTML Browser

HDU 1088 Write a simple HTML Browser 水题,就是会各种PE坑爹、、、不多说 #include <cstdio>#include <cstring>char word[81];int main(){int len, i;int cc = -1;while(scanf("%s", word)==1){if(strcmp(word, "<br>