【做题记录】CF1444A Division
生活随笔
收集整理的這篇文章主要介紹了
【做题记录】CF1444A Division
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF1444A Division
題意:
給定 \(t\) 組詢問,每組給兩個數 \(p_i\) 和 \(q_i\) ,找出最大的整數 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整除,且 \(x_i\) 不可被 \(q_i\) 整除 。
題解:
嗚嗚嗚這道題總共算下來我爆了 \(15\) 發 \(\dots\) 妥妥掉分
-
\(p\nmid q\) :顯然答案為 \(p\) 。
-
\(p\mid q\) :枚舉每個 \(q\) 的因子 \(d\) ,將 \(p\) 一直除 \(d\) 直到不能被 \(q\) 整除為止,余數就是對應的答案 。最終答案就是所有余數中算出來的答案取 \(\max\) 。
為什么這是正確的:因為使勁除完 \(d\) 以后的余數一定是 \(p\) 的因子,且一定不被 \(q\) 整除 。
代碼:
#include<bits/stdc++.h> using namespace std; #define Maxn 105 typedef long long ll; ll maxll(ll x,ll y){ return x>y?x:y; } ll t,p,q,ans; ll cnt(ll x) {ll tmp=p;while(tmp%q==0) tmp/=x;return tmp; } int main() {//freopen(".in","r",stdin);//freopen(".out","w",stdout);scanf("%lld",&t);while(t--){scanf("%lld%lld",&p,&q),ans=1;if(p%q) printf("%lld\n",p);else{for(ll i=2;i*i<=q;i++) if(q%i==0)ans=maxll(ans,cnt(i)),ans=maxll(ans,cnt(q/i));ans=maxll(ans,cnt(q));printf("%lld\n",ans);}}//fclose(stdin);//fclose(stdout);return 0; }總結
以上是生活随笔為你收集整理的【做题记录】CF1444A Division的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美版iPhone和国版有什么区别 美版i
- 下一篇: 【做题记录】CF1451E2 Bitwi