Codeforces1030D. Vasya and Triangle
阿新 • • 發佈:2018-11-25
題目連結:http://codeforces.com/problemset/problem/1030/D
題意:給出一個n*m的矩形,再給出一個k,判斷在矩形中是否存在一個三角形,使得三角形的面積恰好是矩形面積的1/k
題解及程式碼:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int main() { ll n,m,k; cin>>n>>m>>k; ///假定在n*m矩陣中我們以原點(0,0)(x,0)(0,y)三點構建三角形 ///那麼根據題意,有三角形面積 x*y/2 <= n*m/k ///因此, x*y <=2*n*m/k ///若此三角形就是我們需要的三角形,那麼 x*y == 2*n*m/k ///我們很容易看出2*n*m % k==0. ///即符合要求的三角形都滿足2*n*m % k==0 if(2*n*m%k!=0){cout<<"NO";return 0;} else { cout<<"YES"<<endl; cout<<"0 0"<<endl; ///接下來找x,y ///前面已經說過2*n*m % k == 0 ///也就是說k是2*n,2*m,n,m,2中的一個或多個的因子 ///所以我們把2*n*m拆開成2*n和m;(也可以拆成2*m和n,結果無影響) ll gg = __gcd(2*n,k); ll x,y; if(gg==1) { ///不是2*n的因子,是m的因子 ///也就是說我們可以直接選x=n,然後剩下的y=2*m/k x = n; y = 2*m/k; }else { ///公因子大於1,我們就取其剩餘部分就好了 x = 2*n/gg; y = gg*m/k; } cout<<x<<" 0"<<endl; cout<<"0 "<<y<<endl; } }