C. Division(分解质因数)

Problem - 1445C - Codeforces

 

奥列格最喜欢的科目是历史和数学,而他最喜欢的数学分支是除法。

为了提高他的除法技巧,奥列格想出了t对整数pi和qi,并决定为每对整数找到最大的整数xi,这样。

pi能被xi整除。
xi不能被qi整除。
奥列格非常擅长除法,很快就找到了所有的答案,你呢?
输入
第一行包含一个整数t(1≤t≤50)--配对的数量。

接下来的t行包含两个整数pi和qi(1≤pi≤1018;2≤qi≤109)--第i对整数。

输出
打印t个整数:第i个整数是最大的xi,使pi能被xi整除,但xi不能被qi整除。

我们可以证明,在给定的约束条件下,总有至少一个xi的值满足可分条件。

例子
输入
3
10 4
12 6
179 822
输出
10
4
179
注意
对于第一对,p1=10,q1=4,答案是x1=10,因为它是10的最大除数,而且10不能被4整除。

对于第二对,p2=12,q2=6,注意

12不是一个有效的x2,因为12可以被q2=6整除。
6也不是有效的x2。6也不是有效的x2:6也能被q2=6所除。
p2=12的下一个除数是4,这就是答案,因为4不能被6所除。

题解:
如果p%q != 0,那么直接输出p即可

任何一个正整数可以分解为一些质数的次方相乘

p = a1^k1*a2^k2......ai^ki

q = a1^k1*.....ai^ki

如果p%q == 0

说明q里面分解后的质数p里面都有,

那么我们就一个个先找出q的质数,然后check

void check(int x)
{
	long long t = p;
	while(t%q == 0)
	{
		t/=x;
	}
	ans = max(ans,t);
}

把p里面的质数x除到t%q!=0

#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
long long p,q,ans;
void check(int x)
{
	long long t = p;
	while(t%q == 0)
	{
		t/=x;
	}
	ans = max(ans,t);
}
void solve()
{
	cin >> p >> q;
	if(p%q)
	{
		cout<<p<<"\n";
		return ; 
	}
	long long x = q;
	ans = 0;
	for(int i = 2;i*i <= x;i++)
	{
		if(x % i == 0)
		{
			check(i);
		}
		while(x%i == 0)
		x/=i;
	}
	if(x > 1)
	{
		check(x);
	}
	cout<<ans<<"\n";
}
int main()
{
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve();
	}
}
//
//abcdef
//babcdef
//1110011

//p%x == 0
//x%q != 0

//k*q + (1~q-1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值