题意
给定一个正整数 $ n $ ,求一组正整数 $ a $ , $ b $ , $ c $ , $ d $ ,使得 $ a + b + c + d = n $ ,并且 $ \gcd ( a , b ) = \ \operatorname{lcm} ( c , d ) $ 。
题目思路
读完题目之后可以清楚的明白,这一题大概率是一道数学题,单纯写个暴力肯定是过不了数据的。
但是,在略加观察后我们可以发现,题目的每次输入都只有一个数,而且这一题还是 Special Judge 。这就意味着对于每个数大概率是有通法的。这个时候就可以打表来找规律了。
略微打表后,我们对比每一个 $ n $ ,可以清楚地看出对于存在答案的每个 $n$ 当 $ a = 1 \ \ b = n-3 \ \ c = 1 \ \ d = 1 \ \ $ 时,结果是显然成立的。
那么按照惯例,这里只放一下打表的代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int n,a,b,c,d;
int gcd(int a,int b){
if(a<b)swap(a,b);
return b?gcd(b,a%b):a;
}
int lcm(int a,int b){
if(a<b) swap(a,b);
return a*b/gcd(a,b);
}
int main(){
scanf("%d",&n);
for(int q=1;q<=n;q++){
printf("%d\n",q);
for(int i=1;i<=q;i++){
for(int j=1;j<=q;j++){
for(int k=1;k<=q;k++){
for(int l=1;l<=q;l++){
if(i+j+k+l>q) break;
else{
if(i+j+k+l==q){
if(gcd(i,j)==lcm(k,l)) printf("%d %d %d %d\n",i,j,k,l);
}
}
}
}
}
}
}
}