CF1444A Division
文章目录
R e s u l t Result Result

H y p e r l i n k Hyperlink Hyperlink
http://codeforces.com/contest/1444/problem/A
D e s c r i p t i o n Description Description
T T T组数据,每组数据给定 A , B A,B A,B,问满足是 A A A的约数但不是 B B B的倍数的最大的正整数
数据范围: T ≤ 50 , A ≤ 1 0 18 , B ≤ 1 0 9 T\leq 50,A\leq 10^{18},B\leq 10^9 T≤50,A≤1018,B≤109
S o l u t i o n Solution Solution
- 若 A = B A=B A=B,答案即为 A A A的除去本身的最大约数
- 若 A < B AA<B,答案为 A A A
- 若 A > B A>B A>B,若 A A A不是 B B B的倍数答案为 A A A
否则,对 B B B分解质因数,去除到 A A A的该此项小于 B B B即可
时间复杂度: O ( T B ) O(T\sqrt B) O(TB)
C o d e Code Code
#include
#include
#include
#include
#define LL long long
using namespace std;int T;
LL a,b,res;
inline LL read()
{LL d=1,f=0;char c;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{T=read();while(T--){a=read();b=read();if(a==b){for(register int i=2;i*i<=b;i++)if(a%i==0){printf("%lld\n",a/i);goto loop;}puts("1");continue;}if(a>b) {if(a%b!=0) {printf("%lld\n",a);continue;}LL k=a/b,B=b;res=0;for(register int i=2;i*i<=b;i++) if(b%i==0) {LL A=a,now=1;int tot1=0,tot2=0;while(A%i==0) A/=i,tot1++;while(b%i==0) b/=i,tot2++,now*=i;now/=i;LL p=A*now;res=max(res,p);}if(b!=1) {while(a%b==0) a/=b;res=max(res,a);}printf("%lld\n",res);}else printf("%lld\n",a);loop:;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
