是个神仙题

就三种情况,分类讨论。

\(k=2\):

因为保证有解,所以直接输出即可。

\(k=3\):

由于对应情况可以枚举全排列寻找,所以在此只考虑顺序对应时的情况,不妨设六个数分别为\(g_{ab},g_{ac},g_{bc},l_{ab},l_{ac},l_{bc}\),由小学数学知识可知\(g_{ab}l_{ab}=ab,g_{ac}l_{ac}=ac,g_{bc}l_{bc}=bc\),又\(\large\frac{ab\cdot ac}{bc}\normalsize=a^2\),所以\(a=\sqrt{\large\frac{ab\cdot ac}{bc}}\),同理\(b=\sqrt{\large\frac{ab\cdot bc}{ac}},c=\sqrt{\large\frac{ac\cdot bc}{ab}}\)。需要注意的是直接算\(ab\cdot ac\)会爆__int128,在此改为计算\(\Large\frac{ab}{\gcd(ab,bc)}\cdot\frac{ac}{\frac{bc}{\gcd(ab,bc)}}\)。

\(k=4\):

同\(k=3\),不妨设所有数分别为\(g_{ab},g_{ac},g_{bc},g_{ad},g_{bd},g_{cd},l_{ab},l_{ac},l_{bc},l_{ad},l_{bd},l_{cd}\),由于已知\(k=3\)的解法,分别求\(a,b,c\),\(a,b,d\)即可,最后合并答案。

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef __int128 LLL; LLL gcd(LLL u,LLL v){
if(v==0){
return u;
}
return gcd(v,u%v);
} LLL lcm(LLL u,LLL v){
return u/gcd(u,v)*v;
} LLL sqrt(LLL u){
LLL mid,l=1,r=1e18;
while(l<=r){
mid=(l+r)>>1;
if(mid*mid==u){
return mid;
}
else if(mid*mid<u){
l=mid+1;
}
else{
r=mid-1;
}
}
return 0;
} LLL div(LLL a,LLL b,LLL c){
LLL _g=gcd(a,c);
c/=_g;
return (a/_g)*(b/c);
} int t,k,n; LL g[10],l[10],ans[10]; vector<LL>solve3(LLL g12,LLL g13,LLL g23,LLL l12,LLL l13,LLL l23){
LLL ans1,ans2,ans3,x12,x13,x23;
x12=g12*l12;
x13=g13*l13;
x23=g23*l23;
ans1=sqrt(div(x12,x13,x23));
ans2=sqrt(div(x12,x23,x13));
ans3=sqrt(div(x23,x13,x12));
if(ans1*ans2*ans3==0){
return {};
}
if(gcd(ans1,ans2)==g12&&lcm(ans1,ans2)==l12&&
gcd(ans2,ans3)==g23&&lcm(ans2,ans3)==l23&&
gcd(ans1,ans3)==g13&&lcm(ans1,ans3)==l13){
return {(LL)ans1,(LL)ans2,(LL)ans3};
}
else{
return {};
}
} void solve(){
if(k==2){
ans[1]=g[1];ans[2]=l[1];
}
else if(k==3){
for(int i=6;i;i--,next_permutation(g+1,g+4)){
for(int j=6;j;j--,next_permutation(l+1,l+4)){
auto rep=solve3(g[1],g[2],g[3],l[1],l[2],l[3]);
if(rep.empty()){
continue;
}
ans[1]=rep[0];ans[2]=rep[1];ans[3]=rep[2];
return;
}
}
}
else{
for(int i=720;i;i--,next_permutation(g+1,g+7)){
for(int j=720;j;j--,next_permutation(l+1,l+7)){
auto rep1=solve3(g[1],g[2],g[3],l[1],l[2],l[3]),rep2=solve3(g[1],g[4],g[5],l[1],l[4],l[5]);
if(rep1.empty()||rep2.empty()){
continue;
}
if(rep1[0]!=rep2[0]||rep1[1]!=rep2[1]){
continue;
}
if(gcd(rep1[2],rep2[2])!=g[6]||lcm(rep1[2],rep2[2])!=l[6]){
continue;
}
ans[1]=rep1[0];ans[2]=rep1[1];ans[3]=rep1[2];ans[4]=rep2[2];
return;
}
}
}
} int main(){
scanf("%d%d",&t,&k);
n=(k-1)*k/2;
while(t--){
for(int i=1;i<=n;i++){
scanf("%lld",&g[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&l[i]);
}
solve();
for(int i=1;i<=k;i++){
printf("%lld%c",ans[i]," \n"[i==k]);
}
}
return 0;
}

Luogu P5316 【恋恋的数学题】的更多相关文章

  1. 伯努利数学习笔记&&Luogu P3711 仓鼠的数学题

    新科技 Luogu P3711 题意 设$ S_{k,n}$表示$ \displaystyle\sum_{i=0}^n i^k$ 求多项式$\displaystyle\sum_{k=0}^n S_{k ...

  2. Luogu P3768 简单的数学题

    非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_ ...

  3. [Luogu 3768]简单的数学题

    Description 输入一个整数n和一个整数p,你需要求出$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$,其中gcd(a,b)表示a与b的最大公约数. ...

  4. luogu 3708 koishi的数学题 递推 线性筛

    题目链接 题意 输入一个整数\(n\)\((n\leq 1e6)\),设\(f(x)=\sum_{i=1}^n x\mod i\),你需要输出\(f(1),f(2)...,f(n)\). 输入输出格式 ...

  5. luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)

    题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...

  6. luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元

    求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$   考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$   $\Rightarrow \sum_{i ...

  7. LUOGU P3708 koishi的数学题

    传送门 解题思路 发现当x+1时,有的x%i会+1,有的会变成0,而变成0的说明是x的约数,就可以nlogn预处理出每个约数的贡献,然后每次用n-约数. 代码 #include<iostream ...

  8. 沙雕题目 来自luogu

    P5316 恋恋的数学题 题目描述 现在恋恋正在处理的题目十分简单:现在有k (2≤k≤4)k \space (2\leq k\leq 4)k (2≤k≤4)个数,恋恋不知道它们分别是几,只知道它们两 ...

  9. luogu5316

    P5316 恋恋的数学题 题目背景 恋恋是个可爱的女孩子,最近她沉迷了做数学题. 题目描述 现在恋恋正在处理的题目十分简单:现在有k \space (2\leq k\leq 4)k (2≤k≤4)个数 ...

随机推荐

  1. MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍

    mysql 5.7版本 出现 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre ...

  2. js刷新界面前事件onbeforeunload

    这个方法的作用是防止填写信息时不小心按了刷新(F5,刷新界面,返回). 目前能实现这个需求的只有这个方法. 具体代码如下: 1.首先在body添加 onbeforeunload 这个事件 <bo ...

  3. C#复习笔记(3)--C#2:解决C#1的问题(可空值类型)

    可空值类型 C#2推出可空类型来表示可以为null的值类型.这是一个呼声很高的需求,因为在常用的数据库中都是允许某些值类型可为空的.那么为什么值类型就不能为空呢?内存中用一个全0的值来表示null,但 ...

  4. java 线程Thread.Sleep详解 Thread.Sleep(0)的作用(转载)

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果 ...

  5. 运行Spark-shell,解决Unable to load native-hadoop library for your platform

    启动spark后,运行bin/spark-shell会出现一个警告 提君博客原创 WARN util.NativeCodeLoader: Unable to load native-hadoop li ...

  6. Android——SMS接收发短信与运行权限

    好久没写了,最近学习Android的相关知识,包括UI组件与布局.Activity生命周期等,而这次要讲的是,Broadcast Receiver的相关知识,主要是接收发短信,SmsManager.S ...

  7. Linux用户权限指令, 定时任务等指令

    一. 网卡配置详解 网络配置文件: /etc/sysconfig/network 网络接口配置文件: /etc/sysconfig/network-scripts/ifcfg-INTERFACE_NA ...

  8. 利用Python实现“指尖陀螺”,让你释放压力

    前言 利用Python实现“指尖陀螺”,让你释放压力 基本环境配置 版本:Python3 系统:Windows 相关模块:turtle 实现效果 不停点击键盘空格键,这个陀螺会慢慢加速,从而达到一个减 ...

  9. 老男孩python学习自修【第二天】字符串用法

    实时处理增量日志最佳实践 主要使用f.seek()和f.tell()实现 字符串处理函数: s.find(substr, start, end) 查找子字符串,找不到则返回-1,找到则返回对应的索引 ...

  10. oracle数据库备份和恢复

    参考地址:https://www.cnblogs.com/1175429393wljblog/p/9529334.html Oracle数据导入导出imp/exp 在cmd的dos命令提示符下执行,而 ...