题解

我是榜上最后一名= =

可能高精度用vector太慢了吧……什么破题= =

这道题很简单,如果高精度熟练代码……也很简单……然而,参数调了好久

我们发现质数的指数一定是,质数越小,指数越大,这个很显然我不说了

所以我们就用个优先队列BFS就好,队列按数从小到大排序,每次把队列的数取出来作为下一个我们需要的数(也就是大小递增且约数个数严格递增),删掉队列首比这个数约数个数小的数

然后用这个数再扩展一层质数,注意剪枝吧。。

预处理好后回答询问二分就行

质数大小开到85,搜出来的数的总量3810,在TLE的边缘试探……

vector写高精度是真的很慢……

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <set>
//#define ivorysi
#define eps 1e-8
#define mo 974711
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 100005
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
const int64 MOD = 1000000007;
const int BASE = 100000000,LEN = 8;
struct Bignum {
vector<int> v;
Bignum(int64 x = 0){
*this = x;
}
Bignum operator = (int64 x) {
v.clear();
do {
v.pb(x % BASE);
x /= BASE;
}while(x);
return *this;
}
Bignum operator = (const string &str) {
int x;
v.clear();
for(int i = str.length() ; i > 0 ; i -= LEN) {
int ed = i,st = max(i - LEN,0);
sscanf(str.substr(st,ed - st).c_str(),"%d",&x);
v.pb(x);
}
return *this;
}
friend Bignum operator * (const Bignum &a,const Bignum &b) {
Bignum c;c.v.clear();
for(int i = 1 ; i <= a.v.size() + b.v.size() ; ++i) c.v.pb(0);
for(int i = 0 ; i < a.v.size() ; ++i) {
int g = 0;
for(int j = 0 ; j < b.v.size() ; ++j) {
int64 x = 1LL * a.v[i] * b.v[j] + c.v[i + j] + g;
c.v[i + j] = x % BASE;
g = x / BASE;
}
int t = i + b.v.size();
while(g) {
int64 x = c.v[t] + g;
c.v[t] = x % BASE;
g = x / BASE;
++t;
}
}
for(int i = c.v.size() - 1 ; i > 0 ; --i) {
if(c.v[i] == 0) c.v.pop_back();
else break;
}
return c;
}
friend Bignum operator / (const Bignum &a,const int x) {
Bignum c;c.v.clear();
for(int i = 1 ; i <= a.v.size() ; ++i) c.v.pb(0);
int g = 0;
for(int i = a.v.size() - 1 ; i >= 0 ; --i) {
int64 y = 1LL * g * BASE + a.v[i];
c.v[i] = y / x;
g = y % x;
}
for(int i = c.v.size() - 1 ; i > 0 ; --i) {
if(c.v[i] == 0) c.v.pop_back();
else break;
}
return c;
}
friend bool operator < (const Bignum &a,const Bignum &b) {
if(a.v.size() < b.v.size()) return true;
else if(a.v.size() > b.v.size()) return false;
else {
for(int i = a.v.size() - 1 ; i >= 0 ; --i) {
if(a.v[i] < b.v[i]) return true;
else if(a.v[i] > b.v[i]) return false;
}
return false;
}
}
friend bool operator == (const Bignum &a,const Bignum &b) {
if(a.v.size() != b.v.size()) return false;
else {
for(int i = a.v.size() - 1 ; i >= 0 ; --i) {
if(a.v[i] != b.v[i]) return false;
}
return true;
}
}
friend bool operator > (const Bignum &a,const Bignum &b) {return b < a;}
friend bool operator != (const Bignum &a,const Bignum &b) {return !(a == b);}
friend bool operator <= (const Bignum &a,const Bignum &b) {return !(a > b);}
friend bool operator >= (const Bignum &a,const Bignum &b) {return !(a < b);}
void print() {
int s = v.size() - 1;
printf("%d",v[s]);
--s;
for(int i = s ; i >= 0 ; --i) {
printf("%08d",v[i]);
}
}
}N;
int T; bool nonprime[100005];
int prime[100005],cnt;
const int P = 85;
struct node {
Bignum num,val;
int cnt[P + 5];
node(Bignum _num = 0) {
num = _num;
memset(cnt,0,sizeof(cnt));
val = 1;
}
friend node operator * (const node &a,int x) {
node c;c.num = a.num * (Bignum)prime[x];
memcpy(c.cnt,a.cnt,sizeof(c.cnt));
c.cnt[x]++;
c.val = a.val / (a.cnt[x] + 1) * (a.cnt[x] + 2);
return c;
}
friend bool operator < (const node &a,const node &b) {
return a.num < b.num;
}
friend bool operator == (const node &a,const node &b) {
return a.num == b.num;
}
}ans[4005];
int tot = 0;
set<node> S;
void Solve() {
node p = node(1);
int c = 3810;
while(c--) {
ans[++tot] = p;
while(!S.empty()) {
node k = *S.begin();
if(k.val <= p.val) S.erase(S.begin());
else break;
}
S.insert(p * 1);
node k = *S.begin();
S.erase(S.begin());
for(int i = 2 ; i <= cnt ; ++i) {
node t = p * i;
if(t.val <= k.val) continue;
S.insert(t);
}
p = k;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
for(int i = 2 ; i <= 10000 ; ++i) {
if(!nonprime[i]) {
prime[++cnt] = i;
if(cnt >= P) break;
for(int j = 2 ; j <= 10000 / i ; ++j) {
nonprime[i * j] = 1;
}
}
}
ios::sync_with_stdio(false);
Solve();
cin>>T;
string str;
while(T--) {
cin>>str;
N = str;
int L = 1,R = tot;
while(L < R) {
int MID = (L + R + 1) >> 1;
if(ans[MID].num <= N) L = MID;
else R = MID - 1;
}
ans[L].num.print();
putchar(' ');
ans[L].val.print();
putchar('\n');
}
return 0;
}

【51nod】1061 最复杂的数 V2的更多相关文章

  1. 51nod 1061 最复杂的数V2

    题目链接 51nod 1061 题面简述 求\([1, n]\)中约数个数最多的数. \(n \le 10^{200}\) 题解 首先,答案一定是一个反素数. 什么是反素数? 一个正整数\(x\)是反 ...

  2. 51Nod 1084:矩阵取数问题 V2(多维DP)

    1084 矩阵取数问题 V2  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励 ...

  3. 51nod 1218 最长递增子序列 V2——LIS+思路(套路)

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...

  4. 51nod 1218 最长递增子序列 V2(dp + 思维)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 题解:先要确定这些点是不是属于最长递增序列然后再确定这 ...

  5. 51nod 1053 最大M子段和 V2

    N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和. 例如:-2 ...

  6. 51nod 1132 覆盖数字的数量 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1132 题意是给定a,b,l,r求[l,r]内有几个整数可以表示成ax+b ...

  7. 51nod 1479 小Y的数论题

    一脸不可做题~~~233333 T<=100000,所以一定要logn出解啦. 但是完全没有头绪*&#……%*&……()……#¥*#@ 题解: 因为2^p+2^p=2^(p+1) ...

  8. 51nod 1060 最复杂的数

    把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数.   例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6.如果有多个数复杂度相等,输出最 ...

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

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

随机推荐

  1. Maven学习二:使用Nexus搭建Maven私服及相关配置

    处于安全等原因的考虑,一些企业内部网络是不允许访问外部网络的,但是项目内部搭建的项目又是Maven架构,这样就需要企业在内部网络中搭建自己的Maven仓库服务,再者一些大型企业或者内部模块化组件化划分 ...

  2. echarts地图扩展___自定义的svg图

    echarts的自定义地图 标签引入js文件 <script type="text/javascript" src="echarts/require.js" ...

  3. Elasticsearch相关概念了解

    mysql ⇒数据库databases       ⇒表tables     ⇒ 行rows        ⇒ 列columns es   ⇒索引indices        ⇒ 类型types    ...

  4. bzoj千题计划114:bzoj1791: [Ioi2008]Island 岛屿

    http://www.lydsy.com/JudgeOnline/problem.php?id=1791 就是求所有基环树的直径之和 加手工栈 #include<cstdio> #incl ...

  5. hive介绍

    我最近研究了hive的相关技术,有点心得,这里和大家分享下. 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将 ...

  6. 20155232 2016-2017-3 《Java程序设计》第7周学习总结

    20155232 2016-2017-3 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 1.Greenwich MeanTime,格林威治时间,简称GMT时间,由观察太阳 ...

  7. 【leetcode 简单】 第一百零七题 回旋镖的数量

    给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到所有回旋镖的数量.你可以假设 n ...

  8. 一个MMORPG的常规技能系统

    广义的的说,和战斗结算相关的内容都算技能系统,包括技能信息管理.技能调用接口.技能目标查找.技能表现.技能结算.技能创生体(buff/法术场/弹道)管理,此外还涉及的模块包括:AI模块(技能调用者). ...

  9. Django-ORM简介

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  10. Jenkins无法安装插件或首次安装插件界面提示Offline

    一.首先点击系统管理 二.点击插件管理 三.选择高级管理 四.将升级站点中的https改成http即可