参考了别人的思路:https://blog.csdn.net/qq_41608020/article/details/82827632
http://www.cnblogs.com/qywhy/p/9695344.html
首先根据皮克定理,2*m*n/k一定要是一个整数,也就是说2*m*n%k !=0 的都可以不用算了
最简单的构造方法肯定是 (a,0),(0,b)
2*n*m%k ==0,把2*n*m看成2*n和m两部分,k中的质因子,一部分在2*n中,一部分在m中,当然这个“一部分”可以是0
例子:2*3*5%15 == 0 k的质因子分别来自n和m
当k和2*n含有相同的质因子时
令t=gcd(2*n,k) t一定大于等于2
令a = 2n/t a一定小于n
b = (2*m*n)/(a*k)
b=m*t/k b一定小于等于m(因为t一定大于等于k)
当k和2*n不含相同质因子时
那么质因子就全部包含在m里面
直接令a = n b = 2*m/k 即可 因为k >= 2 所以不会超范围
ac:代码
#include<bits/stdc++.h> using namespace std; #define ll long long long long n,m,k; ll gcd(ll a,ll b) { if (b==0) return a; return gcd(b,a%b); } int main() { scanf("%lld%lld%lld",&n,&m,&k); if (n*m*2%k!=0) { printf("NO"); return 0; } printf("YES\n0 0\n"); long long g = gcd(2*n,k); if(g == 1) { ll a = n; ll b = 2*m/k; printf("%lld 0\n",a); printf("0 %lld\n",b); } else { ll a = 2*n/g; ll b = m*g/k; printf("%lld 0\n",a); printf("0 %lld\n",b); } }
原文地址:https://www.cnblogs.com/mltang/p/9700167.html
时间: 2024-10-13 18:00:08