BZOJ 1053

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

840

题解

可以发现,如果某个数是反质数,那么它的质因子一定是前$k$个质数,且这些质数的指数$q_i$是不增的(否则我可以交换两个质数的质数的指数,在因数个数不变的前提下把答案变小),于是直接爆搜。

代码:

#include <cstdio>
typedef long long LL;
int n;
int ans;
int divnum;
const int prime[20] = {
2, 3, 5, 7, 11,
13, 17, 19, 23, 29,
31, 37, 41, 43, 47,
53, 59, 61, 67, 71
};
void dfs(int x, int y, int la, int d) {
if (d > divnum || d == divnum && ans > y) {
ans = y;
divnum = d;
}
if (x >= 20) return;
for (int i = 0; i <= la && y <= n; ++i, y *= prime[x])
dfs(x + 1, y, i, d * (i + 1));
}
int main() {
scanf("%d", &n);
divnum = 0;
dfs(0, 1, 10000, 1);
printf("%d\n", ans);
return 0;
}

 程序中取前20个质数是因为它们乘起来已经超过2000000000了。

BZOJ 3085

同上题,但$N\leq10^{100}$。

我们考虑,若m个质因子为$p_0, \ldots, p_{m-1}$, 指数为$q_0, \ldots, q_{m-1}$,那么对于每个质数$p_i$,我们找出最小的$k_i$使$2^{k_i} > p_i$,就有

$2^{k_i - 1} < p_i$,从而$2^{p_0 + k_i - 1}p_i^{q_i - 1} < 2^{p_0}p_i^{q_i}$。

那么既然它是反素数,我们把$2^{p_0}p_i^{q_i}$换成$2^{p_0 + k_i - 1}p_i^{q_i - 1}$质因数个数一定要减少,即$(p_0 + k_i)q_i < (p_0 + 1)(q_i + 1)$,解得

$$p_i < \frac{p_0 + 1}{k_i - 1}$$

这样就对于所有$p_i (i > 0)$给出了约束。

我们考虑一定不会出现在答案里的$p_m$,对于每个$p_i$,我们找到最小的$t_i$使$p_i^{t_i} > p_m$,那么$p_i^{q_i} > p_i^{q_i - t_i}p_m$,就一定有

$q_i+1 > 2(q_i - t_i + 1)$,即$q_i < 2t_i - 1$。

$q_m$取第一个使$q_0q_1q_2q_3\ldots q_m > n$的质数即可。

然后高精,爆搜。

代码:

#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstring>
#define reg register
typedef long long LL; struct Int{
static const int w = 10000;
int a[30];
Int() {}
Int& operator=(const Int &x) {
memcpy(a, x.a, sizeof a);
return *this;
}
Int(int x) {
memset(a, 0, sizeof a);
a[0] = x;
}
Int& operator*=(int x) {
for (reg int i = 0, t = 0; i < 30; ++i) {
t = (a[i] = a[i] * x + t) / w;
a[i] %= w;
}
return *this;
}
Int& operator+=(int x) {
for (reg int i = 0; i < 30 && x; ++i) {
x = (a[i] += x) / w;
a[i] %= w;
}
return *this;
}
Int operator*(int x) {
Int tmp(*this);
tmp *= x;
return tmp;
}
bool operator<(const Int &y)const{
for (reg int i = 29; ~i; --i)
if (a[i] != y.a[i]) return a[i] < y.a[i];
return 0;
}
bool operator==(const Int &y)const{
for (reg int i = 29; ~i; --i)
if (a[i] != y.a[i]) return 0;
return 1;
}
bool operator<=(const Int &y)const{
return !(y < *this);
}
};
Int n;
Int ans;
LL divnum;
const int prime[] = {
2, 3, 5, 7, 11,
13, 17, 19, 23, 29,
31, 37, 41, 43, 47,
53, 59, 61, 67, 71,
73, 79, 83, 89, 97,
101, 103, 107, 109, 113,
127, 131, 137, 139, 149,
151, 157, 163, 167, 173,
179, 181, 191, 193, 197,
199, 211, 223, 227, 229,
233, 239, 241, 251, 257
};
const int K[] = {
2, 2, 3, 3, 4,
4, 5, 5, 5, 5,
5, 6, 6, 6, 6,
6, 6, 6, 7, 7,
7, 7, 7, 7, 7,
7, 7, 7, 7, 7,
7, 8, 8, 8, 8,
8, 8, 8, 8, 8,
8, 8, 8, 8, 8,
8, 8, 8, 8, 8,
8, 8, 8, 8, 8,
};
int t[55];
int q[55];
int m;
void dfs(int x, Int y, LL d) {
if (d > divnum || (d == divnum && y < ans)) {
ans = y;
divnum = d;
}
if (x >= 55) return;
int Max = 2 * (t[x] - 1);
if (x) Max = std::min(Max, std::min(q[x - 1], (q[0] + 1) / (K[x] - 1)));
LL t;
y *= prime[x];
for (q[x] = 1; q[x] <= Max && y <= n; ++q[x], y *= prime[x])
dfs(x + 1, y, d * (q[x] + 1));
}
void readInt(Int &x) {
x = 0;
char c;
while (!isdigit(c = getchar()));
do (x *= 10) += c - '0';
while (isdigit(c = getchar()));
}
void putInt(const Int &x) {
int t = 30;
while (!x.a[--t]);
printf("%d", x.a[t]);
while (t--) printf("%04d", x.a[t]);
}
int main() {
readInt(n);
divnum = 0;
Int c(1);
for (m = 0; c <= n; ++m)
c *= prime[m];
for (int i = 0; i < m; ++i) {
t[i] = 0;
for (int j = 1; j <= prime[m]; j *= prime[i], ++t[i]);
}
dfs(0, 1, 1);
putInt(ans);
return 0;
}

  

BZOJ1053 [HAOI2007]反素数 & BZOJ3085 反质数加强版SAPGAP的更多相关文章

  1. BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: i ...

  2. bzoj 1053 [HAOI2007]反素数ant——关于质数的dfs / 打表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1053 写了个打表程序. #include<iostream> #include& ...

  3. bzoj:3085: 反质数加强版SAPGAP

    Description 先解释一下SAPGAP=Super AntiPrime, Greatest AntiPrime(真不是网络流),于是你就应该知道本题是一个关于反质数(Antiprime)的问题 ...

  4. POJ 2886 Who Gets the Most Candies?(反素数+线段树)

    点我看题目 题意 :n个小盆友从1到n编号按顺时针编号,然后从第k个开始出圈,他出去之后如果他手里的牌是x,如果x是正数,那下一个出圈的左手第x个,如果x是负数,那出圈的是右手第-x个,游戏中第p个离 ...

  5. BZOJ 1053 反素数ant

           初读这道题,一定有许多疑惑,其中最大的疑惑便是"反素数",反素数的概念很简单,就是,a<b同时a的因数个数大于b的因数个数.但是想要完成本题还需要一些信息,关于 ...

  6. 51nod 1060 最复杂的数 反素数

    1060 最复杂的数 基准时间限制:1 秒 空间限制:131072 KB 把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数. 例如:12的约数为:1 2 3 4 6 ...

  7. zoj 2562 反素数

    题目大意:求n范围内最大的反素数(反素数定义:f(x)表示x的因子数,f(x)>f(x1) (0<x1<x)) x用质因数形式为:x=a1^p1*a2^p2......an^pn(a ...

  8. 【BZOJ1053】[HAOI2007]反素数ant 暴力

    [BZOJ1053][HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) ...

  9. bzoj1053: [HAOI2007]反素数ant

    51nod有一道类似的题...我至今仍然不会写暴搜!!! #include<cstdio> #include<cstring> #include<iostream> ...

随机推荐

  1. python接口自动化2-发送post请求详解(二)

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  2. eclipse远程debug服务器上的项目(Tomcat),打开、关闭及常见错误汇总

    我们工作中,有时候测试/生产环境,出现的结果会与我们预计的不一样,只看代码又看不出去问题所在,这个时候就需要远程debug下服务器上的项目. 注意:(1)需要debug的代码,本机代码需与服务器上一致 ...

  3. XorPay 个人支付平台增加 个人支付宝支付接口

      XorPay 今天新增 个人支付宝当面付 接口,欢迎大家使用. 「 XorPay 支付平台」 已经同时支持 个人微信支付接口 和 个人支付宝接口. 个人可用的 支付宝/微信支付 接口,支持 当面付 ...

  4. Linux(ubuntu18.04)切换python版本

    前言 Ubuntu18.04系统在安装python时会安装两个版本:2.7和3.6.默认情况下系统环境使用的是python2,但是我们有时需要使用python3来作为我们的开发环境,所以需要自由切换p ...

  5. linux 将进程或者线程绑定到指定的cpu上

    基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...

  6. python全栈开发_day16_包

    一:包 1)包就是管理一系列模块的文件夹 2)包中有一个__init__.py文件来专门管理每一个模块(在__init__文件中不建议import导入模块,不建议as起别名) 二:导入完成的工作 1) ...

  7. 思维题--code forces round# 551 div.2

    思维题--code forces round# 551 div.2 题目 D. Serval and Rooted Tree time limit per test 2 seconds memory ...

  8. OpenERP中自定义模块卸载失败,Postgres数据库删不掉数据库,OpenERP登录不了一直在加载的问题解决方案。

    解决方案也就是删除掉不用的数据库,OE会提示当前有N个Session不让Drop数据库. 对于Postgres 9.1 版本,在pgAdmin中查询以下语句: SELECT pg_terminate_ ...

  9. Visual Studio 跨平台開發實戰(1) - Hello Xamarin! (转帖)

    前言 應用程式發展的腳步, 從來沒有停過. 從早期的Windows 應用程式, 到網路時代的web 應用程式, 再到近幾年相當盛行的行動裝置應用程式(Mobile Application), 身為C# ...

  10. 【LESS系列】高级特性

    前面我已经有一篇文章是写 LESS 的基础语法的. 那么这一次我们来看一下 LESS 的高级特性. 说起高级特性,首先也必须要一提的是模式匹配. 虽然个人觉得模式匹配的实用度其实也是一般般,但在关键时 ...