[LOJ#2328]「清华集训 2017」避难所
[LOJ#2328]「清华集训 2017」避难所
试题描述
“B君啊,你当年的伙伴都不在北京了,为什么你还在北京呢?”
“大概是因为出了一些事故吧,否则这道题就不叫避难所了。”
“唔,那你之后会去哪呢?”
“去一个没有冬天的地方。”
对于一个正整数 \(n\),我们定义他在 \(b\) 进制下,各个位上的数的乘积为 \(p = F(n, b)\)。
比如 \(F(3338, 10) = 216\)。
考虑这样一个问题,已知 \(p\) 和 \(b\),求最小的 \(n\) 满足 \(p = F(n, b)\)。
这是一个非常有趣的问题,对于一些 \(b\) 来说,我们可以贪心来做,比如如果 \(b=10, p=216\)。
我们可以从 \(b-1\) 到 \(2\) 试除,直到 \(p\) 为 \(1\) 为止,答案是 \(389\),可以验证 \(389\) 是满足 \(p = F(n, b)\) 最小的 \(n\)。
但是对于一些进制 \(b\),是不能用贪心做的,比如 \(b = 9, p = 216\)。使用贪心得到的解是 \(3338\),而最优解是 \(666\)。(均为 \(9\) 进制下的。)
本题便是在给定进制 \(b\) 的情况下,举出一个这样的反例,或指出这样的反例不存在。
由于计算资源所限,反例中所有数字的乘积不能超过 \(10^{18}\)。如果最小的反例中所有数字的乘积超过了 \(10^{18}\),那么也应该输出 \(-1\)。
输入
从标准输入读入数据。
第一行一个整数 \(t\),表示一共有 \(t\) 组数据。
接下来每行一个整数 \(b\),表示进制。
输出
输出到标准输出。
如果不存在反例,输出一行一个整数 \(-1\)。
如果存在反例,首先输出一个整数 \(k\),表示反例 \(n\) 的位数,接下来在同一行输出 \(k\) 个十进制整数,表示任意一个反例的最优解。
输入示例
3
8
9
10
输出示例
-1
3 6 6 6
-1
数据规模及约定
对于第 \(1\) 个测试点,分值为 \(30\),\(1 \leq b \leq 32\);
对于第 \(2\) 个测试点,分值为 \(40\),\(1 \leq b \leq 100\);
对于第 \(3\) 个测试点,分值为 \(30\),\(1 \leq t \leq 200, 1 \leq n \leq 100000\)。
题解
这题。。。woc居然是个打表。。。
当然只有 \(b \le 130\) 的时候需要打表,剩下的可以构造。
当 \(b > 130\) 时,实验证明都可以用三个相同的数字举出反例,令这相同的三个数字值为 \(p_1p_2\)(这是两个数的乘积),那么需要让他的贪心翻车,就要想方设法让贪心搞出 \(4\) 位数来,即 \(p_2, p_2, p_2, p_1^3\) 这样的一个四位数。
那么只需要满足几个条件:
\(p_1, p_2\) 都是素数
\(p_1p_2 < b\)
\(p_1^3 < b\)
\(p_2^2 \ge b\)
\(p_1p_2 < p_1^3\)
下面是打表程序:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--)
int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define maxn 100010
#define LL long long
int prime[maxn], cp;
bool vis[maxn];
void init() {
rep(i, 2, maxn - 1) {
if(!vis[i]) prime[++cp] = i;
for(int j = 1; j <= cp && i * prime[j] < maxn; j++) {
vis[i*prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
return ;
}
int ans, now[maxn], sol[maxn];
void dfs(int up, int x, int cur) {
if(ans <= cur) return ;
if(x == 1){ ans = cur; rep(i, 1, cur) sol[i] = now[i]; return ; }
dwn(i, up, 2) if(x % i == 0) now[cur+1] = i, dfs(i, x / i, cur + 1);
return ;
}
int main() {
freopen("list.txt", "w", stdout);
init();
int reach = 140;
printf("char Ans[%d][50] = {", reach);
rep(b, 1, reach) {
int x = 1; bool ok = 0;
while(x <= 1000000) {
int tmp = ++x;
// greedy
int cnt = 0;
dwn(i, b - 1, 2) if(tmp % i == 0) tmp /= i, i++, cnt++;
// force
ans = cnt;
dfs(b - 1, x, 0);
if(ans < cnt) {
sort(sol + 1, sol + ans + 1);
printf("\"%d ", ans);
rep(i, 1, ans) printf("%d%c", sol[i], i < ans ? ' ' : '\"');
ok = 1;
break;
}
}
if(!ok) printf("\"-1\"");
printf("%s", b < reach ? ", " : "};\n");
}
return 0;
}
下面是 AC 程序:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--)
int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define maxn 100010
#define LL long long
char Ans[140][50] = {"-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "3 6 6 6", "-1", "-1", "-1", "3 9 10 10", "3 9 10 10", "3 9 10 10", "-1", "3 12 14 14", "3 12 14 14", "3 10 15 15", "3 10 15 15", "3 10 15 15", "3 10 15 15", "3 10 15 15", "3 10 15 15", "3 10 15 15", "3 15 18 18", "3 15 18 18", "3 14 20 21", "3 15 21 21", "3 15 21 21", "3 15 21 21", "3 15 21 21", "3 15 21 21", "3 15 21 21", "3 15 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 21 21 21", "3 22 33 35", "3 22 33 35", "3 22 33 35", "3 22 33 35", "3 22 33 35", "3 22 33 35", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 26 35 39", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 22 44 49", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 26 49 52", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 55 55", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65", "3 33 65 65"};
int prime[maxn], cp;
bool vis[maxn];
void init() {
rep(i, 2, maxn - 1) {
if(!vis[i]) prime[++cp] = i;
for(int j = 1; j <= cp && i * prime[j] < maxn; j++) {
vis[i*prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
return ;
}
int main() {
init();
int T = read();
while(T--) {
int b = read();
if(b > 140) {
bool ok = 0;
for(int i = 1; i <= cp && prime[i] <= b; i++) {
for(int j = 1; j <= cp && prime[j] <= b; j++) {
int p1 = prime[i], p2 = prime[j];
if((LL)p1 * p2 < b && (LL)p1 * p1 * p1 < b && (LL)p2 * p2 >= b && (LL)p1 * p1 > p2) {
printf("3 %lld %lld %lld\n", (LL)p1 * p2, (LL)p1 * p2, (LL)p1 * p2);
ok = 1; break;
}
}
if(ok) break;
}
if(!ok) puts("-1");
}
else puts(Ans[b-1]);
}
return 0;
}
[LOJ#2328]「清华集训 2017」避难所的更多相关文章
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
- Loj 2320.「清华集训 2017」生成树计数
Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...
- [LOJ#2330]「清华集训 2017」榕树之心
[LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...
- [LOJ#2329]「清华集训 2017」我的生命已如风中残烛
[LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...
- [LOJ#2327]「清华集训 2017」福若格斯
[LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最 ...
- [LOJ#2326]「清华集训 2017」简单数据结构
[LOJ#2326]「清华集训 2017」简单数据结构 试题描述 参加完IOI2018之后就是姚班面试.而你,由于讨厌物理.并且想成为乔布斯一样的创业家,被成功踢回贵系. 转眼,时间的指针被指向201 ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
随机推荐
- Mybatis-连接池与事务
Mybatis 的连接池技术 Mybatis 将它自己的数据源分为三类: UNPOOLED 不使用连接池的数据源 POOLED 使用连接池的数据源 JNDI 使用 JNDI 实现的数据源 Mybati ...
- ubuntu安装R时候增加软件源到sources.list,sudo apt-get update不能更新
http://forum.ubuntu.org.cn/viewtopic.php?t=401717 ubuntu安装R时候增加软件源到sources.list,sudo apt-get update不 ...
- Bootstrap 提示工具(Tooltip)插件的事件
事件 下表列出了提示工具(Tooltip)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tooltip 当调用 show 实例方法时立即触发该事件. $('#m ...
- C#的接口基础教程之七 覆盖虚接口
有时候我们需要表达一种抽象的东西,它是一些东西的概括,但我们又不能真正的看到它成为一个实体在我们眼前出现,为此面向对象的编程语言便有了抽象类的概念.C#作为一个面向对象的语言,必然也会引入抽象类这一概 ...
- 第28题:leetcode101:Symmetric Tree对称的二叉树
给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...
- 虚拟机Linux_Mint中安装vmtools增强工具
一开始用VmwarePro安装Linux系统时,系统的整体界面会缩在屏幕中间的一小块区域内.如图: 看的会非常吃力.为了更好的解决这个问题,就需要安装Vmtools增强工具.安装步骤如下: 1. ...
- RPC框架 - thrift 客户端
-------客户端程序 ------ 下载 下载 thrift 源代码包 下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件) \thrift-0.10.0\tu ...
- java util - MD5/AES/RSA快速调用工具
测试代码 package cn.java.security; import java.security.Key; import java.util.Base64; import org.junit.A ...
- JZOJ 4725. 质数序列
Description 由于去NOI的火车“堵”了数不清时间,小Z和小D打完ETG,闲着无聊开始看今年的JSOI省选题,并尝试着修改题目:对于一个长度为L ≥ 2的序列,X:x1,x2,...,xL ...
- ubuntu 把软件源修改为国内源和更新(转载)
1. 备份原始文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 2. 修改文件并添加国内源 vi /etc/apt/sourc ...