You should write a program that help poor students giving the appropriate amount of money to Yaghoub. Of course if there are several answers you go for students' benefit which is the lowest of them.
3 2 6 32 1760 7 16
3 55 NO SOLUTION
題意 :很簡(jiǎn)單 給出a,c求滿(mǎn)足 lcm(a,b)==c 的最小整數(shù)b。沒(méi)有則輸出“NO SOLUTION”。
lcm(a,b)==a*b/gcd(a,b)==c --> a*b==gcd(a,b)*c; --> a/gcd(a,b)==c/b,由于a/gcd(a,b)肯定為整數(shù),所以b肯定是c的因子,枚舉c的因子便可。
1開(kāi)始純暴力枚舉c的因子T了1發(fā),才明白數(shù)學(xué)果然是王道。 枚舉因子在判斷素?cái)?shù)的時(shí)候就有過(guò)優(yōu)化,即只需要枚舉到sqrt(c)。 還有1個(gè)優(yōu)化條件是a必須是c的因子。由于
b/gcd(a,b)==c/a;
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cctype> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> #include <list> #define ll long long using namespace std; const int INF = 0x3f3f3f3f; ll gcd(ll a,ll b) { if(b==0) return a; else return gcd(b,a%b); } void solve(ll a,ll c) { // b/gcd(a,b)==c/a if(c%a) { puts("NO SOLUTION"); return ; } ll b=1,ans=INF; int m=floor(sqrt(c)+0.5); while(b<=m) { if(c%b==0) { if(a*b==c*gcd(a,b)) { ans=min(ans,b); break; } ll sb=c/b; if(a*sb==c*gcd(a,sb)) ans=min(ans,sb); } b++; } if(ans!=INF) printf("%lld ",ans); else puts("NO SOLUTION"); } int main() { int t;ll a,b,c; scanf("%d",&t); // a/gcd(a,b)==c/b; while(t--) { scanf("%lld%lld",&a,&c); solve(a,c); } return 0; }