P8255 [NOI Online 2022 入门组] 数学游戏 题解

题目描述

Kri 喜欢玩数字游戏。

一天,他在草稿纸上写下了 t 对正整数 (x,y),并对于每一对正整数计算出了 z=x×y×gcd(x,y)。

可是调皮的 Zay 找到了 Kri 的草稿纸,并把每一组的 y 都擦除了,还可能改动了一些 z。

现在 Kri 想请你帮忙还原每一组的 y,具体地,对于每一组中的 x 和 z,你需要输出最小的正整数 y,使得 z=x×y×gcd(x,y)。如果这样的 y 不存在,也就是 Zay 一定改动了 z,那么请输出 −1。

注:gcd(x,y) 表示 x 和 y 的最大公约数,也就是最大的正整数 d,满足 d 既是 x 的约数,又是 y 的约数。

输入格式

第一行一个整数 ,表示有 t 对正整数 x 和 z。

接下来 t 行,每行两个正整数 x 和 z,含义见题目描述。

输出格式

对于每对数字输出一行,如果不存在满足条件的正整数 y,请输出 −1,否则输出满足条件的最小正整数 y。

输入输出样例

输入 #1

复制代码
1
10 240

输出 #1

复制代码
12

输入 #2

复制代码
3
5 30
4 8
11 11

输出 #2

复制代码
6
-1
1

输入 #3

复制代码
见附件中的 math3.in

输出 #3复制

复制代码
见附件中的 math3.out

输入 #4

复制代码
见附件中的 math4.in

输出 #4

复制代码
见附件中的 math4.out

说明/提示

【样例 1 解释】

x×y×gcd(x,y) = 10×12×gcd(10,12) = 240。

【数据范围】

对于 20% 的数据,t,x,z ≤

对于 40% 的数据,t ≤ ,x ≤ ,z ≤

对于另 30% 的数据,t ≤

对于另 20% 的数据,x ≤

对于 100% 的数据,1 ≤ t ≤ 5 × ,1 ≤ x ≤ ,1 ≤ z <

附件下载

math.zip1.62MB

代码 :

cpp 复制代码
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;

int gcd(int x,int y){return x==0?y:gcd(y%x,x);}
int mul(int x,int y,int m){
    int r = 0; 
	while (y) {
		if (y&1) r = (r+x)%m; 
		y >>= 1,x = (x+x)%m;
	}
    return r;
}
inline void write(int x) {
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
} 
inline int read() {
	register int x = 0, t = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9') {
		if(ch == '-') t -= 1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar(); 
	}
	return x * t;
} 
signed main(){
    int T; 
	cin >> T;
	while (T --){
        int x,y,z,t,u; 
		x = read(), z = read();
        u = mul(mul(x,x,z),x,z),t = sqrtl((long double)x*gcd(z,u)+0.5),y = z/t;
        if (z != x*y*gcd(x,y)) puts("-1");
        else {
        	write(y);
        	puts("");
		}
    }
    return 0;
}
相关推荐
AI科技星11 分钟前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
橘颂TA13 分钟前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹16 分钟前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
liulilittle18 分钟前
OPENPPP2 网络驱动模式
开发语言·网络·c++·网络协议·信息与通信·通信
mjhcsp21 分钟前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
寻星探路26 分钟前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
wen__xvn28 分钟前
力扣第 484 场周赛
算法·leetcode·职场和发展
YuTaoShao39 分钟前
【LeetCode 每日一题】865. 具有所有最深节点的最小子树——(解法一)自顶向下
算法·leetcode·职场和发展
爱吃生蚝的于勒41 分钟前
【Linux】进程间通信之匿名管道
linux·运维·服务器·c语言·数据结构·c++·vim
wanderist.1 小时前
C++输入输出的一些问题
开发语言·c++·图论