nq1s788

Вася и треугольник

Nov 2nd, 2025
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. Удвоенная площадь треугольника, углы которого лежат в целочисленных точках всегда целочисленна. Поэтому если 2𝑛𝑚
  2.  не делится на 𝑘
  3. , то невозможно найти подходящий треугольник.
  4.  
  5. Иначе всегда можно найти подходящий треугольник. Для этого сначала разделим 𝑘
  6.  на 2
  7. , если он четно. После это найдем 𝑔=gcd(𝑘,𝑛)
  8. , где gcd(𝑥,𝑦)
  9.  — наибольший общий делитель чисел 𝑥
  10.  и 𝑦
  11. . Обозначим 𝑘 ′=𝑘𝑔
  12.  и запомним длину первой стороны треугольника — число 𝑎=𝑛𝑔
  13. . Затем запомним длину второй стороны треугольника — число 𝑏=𝑚𝑘 ′
  14. . Теперь, если в начале мы не делили 𝑘
  15.  на 2
  16. , нам нужно домножить одну из сторон 𝑎
  17.  или 𝑏
  18.  на 2. Домножим 𝑎
  19.  на 2, если она меньше 𝑛
  20. , иначе домножим 𝑏
  21.  на 2. Заметим, что если 𝑎=𝑛
  22. , то 𝑏
  23.  обязательно будет меньше 𝑚
  24. .
  25.  
  26. После этого ответ найден — треугольник в точках (0,0),(𝑎,0),(0,𝑏)
  27. . Нетрудно убедиться, что его площадь равна 𝑛𝑚𝑘
  28. .
  29.  
  30. #include<bits/stdc++.h>
  31.  
  32. using namespace std;
  33.  
  34. long long gcd(long long a, long long b){
  35.     return a? gcd(b % a, a) : b;
  36. }
  37.  
  38. int main() {
  39.     //freopen("input.txt", "r", stdin);
  40.    
  41.     long long n, m, k;
  42.     cin >> n >> m >> k;
  43.    
  44.     bool isEven = k % 2 == 0;
  45.     long long p = n * m;
  46.     if(isEven) k /= 2;
  47.    
  48.     if(p % k != 0){
  49.         cout << "NO" << endl;
  50.         return 0;
  51.     }
  52.    
  53.     long long x = gcd(n, k);
  54.     k /= x;
  55.     long long a = n / x;
  56.        
  57.     x = gcd(m, k);
  58.     k /= x;
  59.     assert(k == 1);
  60.     long long b = m / x;
  61.        
  62.    
  63.     if(!isEven){
  64.         if(a < n)
  65.             a += a;
  66.         else{
  67.             assert(b < m);
  68.             b += b;
  69.         }
  70.     }
  71.    
  72.     cout << "YES" << endl;
  73.     cout << "0 0\n";
  74.     cout << 0 << ' ' << b << endl;
  75.     cout << a << ' ' << 0 << endl;
  76.    
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment