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
題意 :很簡單 給出a,c求滿足 lcm(a,b)==c 的最小整數(shù)b。沒有則輸出“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開始純暴力枚舉c的因子T了1發(fā),才明白數(shù)學(xué)果然是王道。 枚舉因子在判斷素數(shù)的時候就有過優(yōu)化,即只需要枚舉到sqrt(c)。 還有1個優(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; }