luogu5316
P5316 恋恋的数学题
题目背景
恋恋是个可爱的女孩子,最近她沉迷了做数学题。
题目描述
现在恋恋正在处理的题目十分简单:现在有k \space (2\leq k\leq 4)k (2≤k≤4)个数,恋恋不知道它们分别是几,只知道它们两两最大公约数及最小公倍数。
按照套路,恋恋非常想复原出那kk个数,但是现在她需要假装不会做,于是她就把题目交给了你,如果你顺利解决了这个问题,恋恋就会在你背后疯狂打call……
输入输出格式
输入格式:
第一行,两个整数TT和kk
接下来2T2T行包含TT组数据,每组数据包含两行,
第一行,\frac{k(k-1)}22k(k−1)个整数,表示kk个未知数的两两最大公约数,乱序
第二行,\frac{k(k-1)}22k(k−1)个整数,表示kk个未知数的两两最小公倍数,乱序
输出格式:
输出TT行,每行kk个用空格分隔的数,表示任意一组符合对应数据的答案。
输入输出样例
2 4
4 2 4 6 4 2
48 144 16 36 12 36
1 1 1 1 2 1
56 63 70 72 40 90
16 12 18 4
7 8 9 10
说明
保证奇数测试点中,第一行(gcd行)数据均为11
| 测试点编号 | kk | 输入整数不超过 |
|---|---|---|
| 1,2 | 2 | 100100 |
| 3,4 | 2 | 10001000 |
| 5,6 | 2 | 10^7107 |
| 7,8 | 3 | 100100 |
| 9,10 | 3 | 10^7107 |
| 11,12 | 3 | 10^{14}1014 |
| 13,14 | 4 | 100100 |
| 15,16 | 4 | 10^7107 |
| 17,18 | 4 | 10^{14}1014 |
| 19,20 | 4 | 10^{18}1018 |
保证数据有解,T\leq 5T≤5
SPJ按照每组中的正确比例给分,但如果TLE、RE等会导致无输出而爆零
sol:这个k非常小,所以那个乱序就是让我们爆搜用的,知道了每个数字两两之间的gcd和lcm就很好做了,因为gcd(a,b)*lcm(a,b)=a*b,所以我们就得到了每个数字两两之间的乘积 易知a=sqrt((a*b)*(a*c)/(b*c))
这样就可以轻松做出k=3的数据了,然后我暂时还没想出k=4怎么做(感觉用一模一样的方法可以过720*720*4*玄学)
但是k=4还没写。。。所以只有60pts
Ps :丧心病狂的出题人卡long long ,甚至直接__int128有些地方也会爆
感觉洛谷完全做不动了
#include <bits/stdc++.h>
using namespace std;
//typedef long long ll;
inline __int128 read()
{
__int128 s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(__int128 x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n') #define G1 Gcd[1]
#define G2 Gcd[2]
#define G3 Gcd[3]
#define G4 Gcd[4]
#define G5 Gcd[5]
#define G6 Gcd[6]
#define L1 Lcm[1]
#define L2 Lcm[2]
#define L3 Lcm[3]
#define L4 Lcm[4]
#define L5 Lcm[5]
#define L6 Lcm[6]
int T,n;
__int128 Gcd[],Lcm[]; inline __int128 Div(__int128 a,__int128 b,__int128 c); //a*b/c
inline __int128 Sqrt(__int128 x);
inline __int128 gcd(__int128 a,__int128 b);
inline __int128 lcm(__int128 a,__int128 b);
inline bool Judge(__int128 a,__int128 b,__int128 c); //a,b,c是否满足条件 inline __int128 Div(__int128 a,__int128 b,__int128 c) //a*b/c
{
__int128 g1=gcd(a,c),g2=c/g1;
return (a/g1)*(b/g2);
}
inline __int128 Sqrt(__int128 x)
{
__int128 l=,r=1e18;
while(l<=r)
{
__int128 mid=(l+r)>>;
if(mid*mid==x) return mid;
else if(mid*mid<x) l=mid+;
else r=mid-;
}
return ;
}
inline __int128 gcd(__int128 a,__int128 b)
{
return (!b)?(a):(gcd(b,a%b));
}
inline __int128 lcm(__int128 a,__int128 b)
{
return Div(a,b,gcd(a,b));
}
inline bool Judge(__int128 a,__int128 b,__int128 c)
{
if((gcd(a,b)!=G1)||(lcm(a,b)!=L1)) return false;
if((gcd(a,c)!=G2)||(lcm(a,c)!=L2)) return false;
if((gcd(b,c)!=G3)||(lcm(b,c)!=L3)) return false;
return true;
}
namespace n2
{
inline void Solve()
{
while(T--)
{
W(read()); Wl(read());
}
}
}
namespace n3
{
inline void Solve()
{
int i;
while(T--)
{
for(i=;i<=;i++) R(Gcd[i]);
for(i=;i<=;i++) R(Lcm[i]);
sort(Gcd+,Gcd+);
do
{
sort(Lcm+,Lcm+);
do
{
__int128 ab=G1*L1,ac=G2*L2,bc=G3*L3;
__int128 a2=Div(ab,ac,bc),b2=Div(ab,bc,ac),c2=Div(ac,bc,ab);
__int128 a=Sqrt(a2),b=Sqrt(b2),c=Sqrt(c2);
if((!a)||(!b)||(!c)) continue;
else if(Judge(a,b,c))
{
W(a); W(b); Wl(c); goto loop;
}
}while(next_permutation(Lcm+,Lcm+));
}while(next_permutation(Gcd+,Gcd+));
loop:;
}
}
}
namespace n4
{
inline void Solve()
{ }
}
int main()
{
R(T); R(n);
if(n==) n2::Solve();
else if(n==) n3::Solve();
else if(n==) n4::Solve();
return ;
}
/*
input
1 3
4 6 2
48 144 36
output
16 12 18
*/
luogu5316的更多相关文章
随机推荐
- ES10特性详解
摘要: 最新的JS特性. ES10 还只是一个草案.但是除了 Object.fromEntries 之外,Chrome 的大多数功能都已经实现了,为什么不早点开始探索呢?当所有浏览器都开始支持它时,你 ...
- sublime前端必备插件
1,docblockr javascr 和 CSS快捷注释插件 在javascript中 写出函数后,/**+回车 就会出现下面函数注释补全. -----/** * @param {[typ ...
- JavaScript splice() 方法和JavaScript split() 方法
定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法 arrayObject.splice(index,howmany,item1, ...
- 如何把activity当成dialog
在工作中有时候需要把activity当成dialog使用,其实做法挺简单的. 1.设置activity的style <style name="DialogTheme" par ...
- C++ 死循环在语言层面的检测
英文概念 Infinite loop without side-effects 这个目前只有CLang实现了这个C++特色 #include <iostream> int 费马定理() { ...
- SQL Server 数据库调整表中列的顺序操作
SQL Server 数据库中表一旦创建,我们不建议擅自调整列的顺序,特别是对应的应用系统已经上线,因为部分开发人员,不一定在代码中指明了列名.表是否可以调整列的顺序,其实可以自主设置,我们建议在安装 ...
- 操作DataTable数据,修改某列的值
DataTable table : DataRow row=table.Rows[i];//DataTable的第i行 row.BeginEdit();//开始编辑行 row["column ...
- c/c++ 继承与多态 继承中的public, protected, private
问题:类B私有继承类A,类A有个protected成员,那么在类B的成员函数里是否可以使用类A的protected成员? 可以使用. 估计有的同学说不对吧,类B都私有继承了类A了,怎么还能访问类A的p ...
- Windows程序设计:格式化对话框的设计
刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的. MessageBox函数是许多人刚开始学习Windows程序设计或者是 ...
- MPLAB X IDE调试仿真功能简单入门
仿真分为硬件仿真和软件仿真,这里的硬件仿真和软件仿真的区别,就不多说了,相信大家都听说过这两个概念. 我这里想给大家介绍的是“Set PC at Cursor”--“设置PC到光标处”这个功能,这个功 ...