辽宁OI2016夏令营模拟T1-dis
数值距离(dis.pas/c/cpp)
题目大意
我们可以对一个数 x 进行两种操作:
1、 选择一个质数 y,将 x 变为 x*y
2、 选择一个 x 的质因数 y,将 x 变为 x/y
定义两个数 a,b 之间的距离为把 a 变成 b 所需要执行的最少操作次数。例如数 69 与 42
之间的距离为 3,因为 42=69/23*2*7
现在有一个长度为 n 的序列 a1,a2,…,an。对于每一个 i,我们需要找到一个 j,使得 ai 到
aj 的距离最小,若有多个 j 满足条件,输出最小的 j。
输入文件
输入文件为 dis.in。
输入共有 n+1 行,第一行有一个数 n,接下来 n 行每行一个数 ai。
输出文件
输出文件为 dis.out。
输出一共 n 行,每行一个整数,第 i 行的整数表示对于 i 所求得的 j 是多少。
样例输入
6
1
2
3
4
5
6
样例输出
2
1
1
2
1
2
数据规模与约定
对于 30%的数据,n≤1000;
另有 20%的数据,ai≤1000;
对于 100%的数据,2≤n≤100000,1≤ai≤1000000。
——————————————————题解
这道题的暴力思路就是枚举每两个数,然后算这两个数的gcd,然后两个数的分解质因数个数的和减去2*gcd分解质因数的个数就是距离,找最小,这是(n^2logn)的
大概12,16这两个数,gcd是4,4=2*2,12=2*2*3,16=2*2*2*2,12和16的距离就是(4+3)-2*2
这样就可以轻松愉快的拿到30分了!【然而我很弱,爆了0……orz】
然后我们发现每两个数的距离(不一定是最小距离)可以写作这两个数分解质因数个数和减去他们俩共同的约数的分解质因数个数
我们可选择不枚举数,而是枚举他们的约数,显然约数为gcd的时候距离这小,但这会在不断更新约数的时候被更新到。
设约数为k,然后我们在a1,a2...an的序列里找到k的倍数并向k连一条边,由于a约数的对数不会超过a^0.5,所以我们枚举的次数不会超过10^3n (10^6^0.5)
然后我们暴力的枚举到一个约数离它最近的最小数和次小数,次小数更新最小数(因为最小数不能自我更新),最小数更新其他数。也是10^3n的。
这道题输出的是下标!!!这道题输出的是下标!!!这道题输出的是下标!!!这道题输出的是下标!!!orz自己真是越来越瞎了
还有要学会用pair……
【注意:这里的ans并非输出的答案,而是最小的距离】
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#define siji(i,x,y) for(int i=(x);i<=(y);i++)
#define gongzi(j,x,y) for(int j=(x);j>=(y);j--)
#define xiaosiji(i,x,y) for(int i=(x);i<(y);i++)
#define sigongzi(j,x,y) for(int j=(x);j>(y);j--)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
vector<pii> list[];
int n,num[];
pii ans[];
int factor[],prime[],cnt;
bool isprime[];
void init() {
scanf("%d",&n);
siji(i,,) {
if(!isprime[i]) {factor[i]=;prime[++cnt]=i;}
for(int j=;prime[j]*i<=;j++) {
isprime[prime[j]*i]=;
factor[prime[j]*i]=factor[prime[j]]+factor[i];
//质因子是什么不重要,我们只要知道个数就可以了
if(i%prime[j]==) break;
}
}
siji(i,,n) {
scanf("%d",&num[i]);
ans[i].fi=0x1f1f1f1f;
int t=(int)sqrt(num[i]);//从1-a[i]^0.5枚举看看那些是它的约数,是它的约数就有可能是它和别的数的gcd
siji(j,,t) {
if(num[i]%j== && j*j!=num[i]) {
list[j].push_back(pii(factor[num[i]/j],i));
list[num[i]/j].push_back(pii(factor[j],i));
}
else if(num[i]%j== && j*j==num[i]) {
list[j].push_back(pii(factor[j],i));
}
}
} } void solve() {
siji(i,,) {
if(list[i].size()>) {
pii t1=list[i][],t2=list[i][];//讲真pair会省掉很多比较的麻烦,orz蒟蒻的自言自语罢了
//在比较时first的权重较大,所以first小的在前面,first相同再是second,second小的在前面,perfect
if(t2<t1) swap(t1,t2);
int s=list[i].size();
xiaosiji(j,,s) {
if(t2>list[i][j]) t2=list[i][j];
if(t2<t1) swap(t1,t2);
}
xiaosiji(j,,s) {
if(list[i][j]!=t1) {
ans[list[i][j].se]
=min(ans[list[i][j].se],pii(t1.fi+list[i][j].fi,t1.se));
}
}
ans[t1.se]=min(ans[t1.se],pii(t1.fi+t2.fi,t2.se)); }
}
siji(i,,n) {
printf("%d\n",ans[i].se);
}
}
int main(int argc, char const *argv[])
{
freopen("dis.in","r",stdin);
freopen("dis.out","w",stdout);
init();
solve();
return ;
}
辽宁OI2016夏令营模拟T1-dis的更多相关文章
- 辽宁OI2016夏令营模拟T2-road
最短路(road.pas/c/cpp)题目大意有一个点数为 n,边数为 m 的无向图,点的编号为 1 到 n.边的权值均为非负数.现在请你求出从点 1 到点 n 的最短路径条数,若有无限条则输出-1, ...
- 辽宁OI2016夏令营模拟T3-chess
放棋子(chess.pas/c/cpp)题目大意现在有一个 n*m 的棋盘,现在你需要在棋盘上摆放 2n 个棋子,要求满足如下条件:1. 每一列只能有一个棋子:2. 每一行的前 xi 个格子有一个棋子 ...
- 20181229模拟 T1 palindrome
20181229模拟 T1 palindrome 题意 : \(S\)是字符串\(s\)的子串可重集,求\(\sum\limits_{x\in S}\sum\limits_{y\in S}(|x|+| ...
- 模拟T1数字number
那么第一题首先非常水的一道题…… 看一下题 数字(number) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK拥有n个数,这n个数分别是a1,a2,… ...
- 洛谷金秋夏令营模拟赛 第2场 T11737 时之终末
这道题就是道状压dp...比赛的时候太贪心 然后状压又不好 所以T2 T3一起挂了QAQ 吸取教训QAQ f[i][j][k]表示前i个数选了j个 最后a个的状态为k的答案 #include<c ...
- 洛谷金秋夏令营模拟赛 第2场 T11738 伪神
调了一个下午只有八十分QAQ md弃了不管了 对拍也没拍出来 鬼知道是什么数据把我卡了QAQ 没事我只是个SB而已 这题其实还是蛮正常的 做法其实很简单 根据链剖的构造方法 你每次修改都是一段又一段的 ...
- 「题解」:07.16NOIP模拟T1:礼物
问题 A: 礼物 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼 ...
- 51nod1185 威佐夫游戏 V2 (模拟乘法)
1185 威佐夫游戏 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...
- LUOGU NOIP 2018 模拟赛 DAY1
T1 传送门 解题思路 这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了. #include<iostream> #include&l ...
随机推荐
- apns关于APP数字角标的理解
前两天群里有兄弟在吐槽,做远程推送的时候:老板要求APP桌面图标的右上角显示红色未读数字(数字角标)要精准,有多少未读通知就显示数字几:但是后台的弟兄在发送推送通知的时候,每次的角标是1,然后要移动端 ...
- Spark 2.x不支持ALTER TABLE ADD COLUMNS,没关系,我们改进下
SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], .. ...
- Node.js学习笔记(一):快速开始
最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...
- Maven配置插件跳过测试代码的编译和运行
Maven配置插件跳过测试代码的编译和运行: <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins< ...
- 从minist database(t10k-images-idx3-ubyte)中读取图片
matlab代码(亲测,可运行出来): % Matlab_Read_t10k-images_idx3.m % 用于读取MNIST数据集中t10k-images.idx3-ubyte文件并将其转换成bm ...
- 【python标准库】内建函数
abs(x) 返回一个数的绝对值.参数可以是普通的整数,长整数或者浮点数.如果参数是个复数,返回它的模. all(iterable) 如果iterable的所有元素为真(或者iterable为空), ...
- 敏捷开发(八)- Scrum Sprint计划会议1
本文主要是为了检测你对SCRUM Sprint 计划会议的了解和使用程度, 通过本文你可以检测一下 1.你们的SCRUM Sprint 计划会议的过程和步骤 2.会议的输出结果 S ...
- PhpMyAdmin隐藏数据库设置同前缀失效的问题
用PhpMyAdmin默认会把所有数据库都显示出来,一些如 MySQL,information_schema之类的也会显示,这样既不安全看着也不爽,隐藏掉最好. 修改 config.inc.php 或 ...
- myeclipse里如何添加mysql数据库
首先声明,这只是我本人的一些经验,不代表任何集体和个人的利益,请勿没事就当喷子来喷我.我希望对一些对这方面学习的朋友有帮助,当然,我自己也是菜鸟级别啦!!!!!!!!!!!! 首先是电脑必要安装了my ...
- MFC 刷新失效的Picture控件
问题描述:如在摄像头显示时,关闭摄像头,此时Picture控件仍然显示最后一帧图像,需要刷新掉,还原Picture控件.或者重复显示两张不同大小的图片时,第二张背景有第一张图片残留. 解决方法1:(最 ...