1102: 三个分数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 41 Solved: 16
[ Submit][ Status][ Web Board]
Description
给出一个整数n(1<=n<=10^5),
请判断能否找到三个不相等的正整数x、y、z,
使得等式 2/n = 1/x + 1/y + 1/z 成立。
Input
第一行有一个整数t,表示数据组数。
接下来t行每行一个整数表示n。
Output
对于每组数据中的n,
如果可以找到满足条件的三个整数,输出"Yes"
(比如当n=3,可以找到x=2,y=7,z=42,使得2/3=1/2+1/7+1/42)
否则输出"No"(均不带引号)
Sample Input
1
3
Sample Output
Yes
HINT
Source
其实大于2都有解
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int dfs(int n){
int son=2;
int mon=n;
int yuefen=1;
int i=0;
for(i=2;son*i<=mon;i++){}
//cout<<"-1/"<<i<<endl;
son=son*i-mon;
mon=mon*i;
for(yuefen=2;yuefen<=son;yuefen++){
if(son%yuefen==0&&mon%yuefen==0){
son/=yuefen;
mon/=yuefen;
}
}
if(1==son)return 0;
//cout<<son<<"/"<<mon<<endl;
for(i=mon/son+1;son*i<=mon;i++){}
son=son*i-mon;
mon=mon*i;
//cout<<"-1/"<<i<<endl;
for(yuefen=2;yuefen<=son;yuefen++){
if(son%yuefen==0&&mon%yuefen==0){
son/=yuefen;
mon/=yuefen;
}
}
//cout<<son<<"/"<<mon<<endl;
if(1==son)return 1;
else return 0;
}
int main(){
int t, n;
cin>>t;
while(t--){
cin>>n;
if(1==n||2==n){
cout<<"No"<<endl;
continue;
}
if(dfs(n))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}