水题挑战6: CF1444A DIvision
A. Division
time limit per test1 second
memory limit per test512 megabytes
inputstandard input
outputstandard output
Oleg's favorite subjects are History and Math, and his favorite branch of mathematics is division.
To improve his division skills, Oleg came up with \(t\) pairs of integers \(p_i\) and \(q_i\) and for each pair decided to find the greatest integer \(x_i\), such that:
\(p_i\) is divisible by \(x_i\);
\(x_i\) is not divisible by \(q_i\).
Oleg is really good at division and managed to find all the answers quickly, how about you?
Input
The first line contains an integer \(t\) \((1\leq t\leq 50)\) — the number of pairs.
Each of the following \(t\) lines contains two integers \(p_i\) and \(q_i\) (\(1≤p_i≤10^18\); \(2≤q_i≤10^9\)) — the \(i-th\) pair of integers.
Output
Print \(t\) integers: the \(i-th\) integer is the largest \(x_i\) such that \(p_i\) is divisible by \(x_i\), but xi is not divisible by \(q_i\).
One can show that there is always at least one value of xi satisfying the divisibility conditions for the given constraints.
Example
input
3
10 4
12 6
179 822
output
10
4
179
SOLUTION
这还算一道良心数学题
首先我们发现,我们先把p, q质因数分解,有如下结果:
\(p = a_1^p_1 \times a_2^p_2\times ... \times a_m^p_m \times ... a_n^p_n\)
\(q = a_1^q_1 \times a_2^q_2\times ... \times a_m^q_m\)
其中, \(m<n\)
注意,当\(p mod q!=0\), 答案就是\(p\)
当\(p mod q=0\)
就是任意小于\(m\)的数\(i\),\(q_i <= p_i\)
于是,我们就只要考虑前\(m\)个质因数
我们只要对于\(p\)的任意一个质因数,\(p_i\)变成\(q_i-1\),就是一个符合条件的答案
求出最大的,我们只需要考虑变化代价最小的计算出来就好了
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template <class T> void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
typedef unsigned long long ll;
const int N = 1e5+4;
int pri[N], tot, vis[N];
ll p,q,ans;
void pre(){
int End = sqrt(1e9)+1;
for(int i=2; i <= End; i++){
if(!vis[i]) pri[++tot]=i;
for(int j=1; j <= tot; j++){
if( i*pri[j] > End ) break;
vis[i*pri[j]] = 1;
if( i%pri[j] == 0 ) break;
}
}
}
int st[N], tp, num1[N], num2[N];
ll s1[N], s2[N];
int main(){
int T; g(T);
pre();
// rep(i,1,10) cout<<pri[i]<<endl;
while(T--){
g(p), g(q);
if( p%q ) ans = p;
else{
tp = 0; ll nowq = q; ans = 0;
for( int i=1; pri[i]*pri[i] <= nowq && i<=tot; i++ ){
if( nowq % pri[i] == 0 ){
st[++tp] = pri[i]; s1[tp] = 1;
while( nowq % pri[i] == 0 ){
// puts("orz");
nowq /= pri[i];
s1[tp] *= pri[i];
}
}
}
if( nowq >1 ) st[++tp] = nowq, s1[tp] = nowq;
ll nowp = p;
for( int i=1; i <= tp; i++ ){
ll tmp = nowp / s1[i]; s2[i] = s1[i];
while( tmp % st[i] == 0 ){
// puts("orz");
s2[i] *= st[i];
tmp /= st[i];
}
nowp = tmp;
}
ll mn = 1e18;
for( int i=1; i <= tp; i++ ){
// cerr<<s1[i]<<endl;
s2[i] = s2[i]/s1[i]*st[i];
mn = min( mn, s2[i] );
}
ans = p/mn;
}
printf("%llu\n",ans);
}
return 0;
}
水题挑战6: CF1444A DIvision的更多相关文章
- 水题挑战4: luogu P1280 尼克的任务
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为 \(n\) 分钟,从 ...
- 【做题记录】CF1444A Division
CF1444A Division 题意: 给定 \(t\) 组询问,每组给两个数 \(p_i\) 和 \(q_i\) ,找出最大的整数 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整 ...
- 水题挑战3: NOIP 2017 宝藏
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋 ...
- 水题挑战1:NOIP 2013 选择客栈
丽江河边有\(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 \sim k-1\) 表示),且 ...
- 水题挑战2 :NOIP提高组 2011 聪明的质监员
小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从\(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) .检验矿 ...
- 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem A: The 3n + 1 problem(水题)
Problem A: The 3n + 1 problem Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 14 Solved: 6[Submit][St ...
- 烟大 Contest1025 - 《挑战编程》第二章:数据结构 Problem A: Jolly Jumpers(水题)
Problem A: Jolly Jumpers Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 10 Solved: 4[Submit][Status] ...
- codeforcess水题100道
之所以在codeforces上找这100道水题的原因是为了巩固我对最近学的编程语言的掌握程度. 找的方式在codeforces上的PROBLEMSET中过的题最多的那些题里面出现的最前面的10个题型, ...
- CF1444A Division 求质因数的方法
2020.12.20 求质因数的方法 CF1444A Division #include<bits/stdc++.h> #define ll long long #define fp(i, ...
随机推荐
- linux的安装3.7python
centos安装python3 首先安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-dev ...
- 发布MeteoInfo 1.2.6
增加了对AWX卫星数据格式的支持(和C#版本的功能相当).在MeteoInfo中打开AWX数据: 在MeteoInfoLab中打开AWX数据:
- go 虎牙爬取
package main import ( "fmt" "github.com/antchfx/htmlquery" "io/ioutil" ...
- vue-awesome-swiper ---移动端h5 swiper 和 tab 栏选项联动效果实现
很久之前做小程序时有个类似每日优鲜里储值卡充值界面里的 卡轮播和价格tab栏联动效果,当时觉得新鲜做出来之后也没当回事.直到今天又遇到了一个类似的功能,所以想着总结经验. 实现效果如下图: 图解:点击 ...
- Linux运维学习第五周记
休惊岁岁年年貌 且对朝朝暮暮人 细雨晴时一百六 画船鼍鼓莫违民 雨生百谷,春雨贵如油 第五周学记 这周主要学习了九三级磁盘.存储相关知识和Linux文件系统以及计算机网络的内容 磁盘和文件系统 磁盘结 ...
- MVC登录
前言 最近没什么好写的,准备把MVC的登录再写一下,巩固一下 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head& ...
- 微信小程序分类的实现
微信小程序的分类功能思路 实现思路 1.把屏幕当成一个固定的盒子,然后把盒子分成两边,并让盒子的每一边都能够滚动. 2.通过将左侧边栏元素的id和右边内容的categoryId进行匹配,渲染展示相同i ...
- JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...
- Python入门教程完整版(懂中文就能学会)
前几天给大家分享<从零学会Photoshop经典教程300集>的教程受到了广泛的关注,有人不知道怎么领取,居然称小编为"骗子". 不过小编的内心是强大的,网友虐我千百遍 ...
- Asp.Net Core 查漏补缺《一》 —— IStartFilter
Asp.Net Core 查漏补缺<一> -- IStartFilter IStartFilter 实现了Configure,如下图一,而Configure方法接受并返回Action< ...