N:自然数, Q:有理数,构造双射函数(双射函数概念请看离散数学)
输入:多行,每行两个整数a和b,中间有一个空格,表示一个有理数a/b
输出:对应的多行,每行一个整数,有理数a/b的双射函数对应的自然数,结果<100000
输入样例:
-2 1
-4 1
-1 2
输出样例:
5
19
3
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct fraction{
int a;
int b;
};
int isSimplest(int a,int b){//判断是否是最简分数
int q;
q = a%b;
while(q>0) {
a = b;
b = q;
q = a%b;
}
if(b==1)
return 1;
else
return 0;
}
int main() {
vector<fraction> v;
fraction f;
f.a=0; f.b=1;
v.push_back(f);
for(int i=1;i<=600;i++){
for(int j=1;j<=i+1;j++){
if(isSimplest(i,j)){
i%2?f.a=i:f.a=-i;
f.b=j;
v.push_back(f);
}
}
for(int j=i-1;j>=1;j--){
if(isSimplest(j,i+1)){
i%2?f.a=j:f.a=-j;
f.b=i+1;
v.push_back(f);
}
}
for(int j=1;j<=i-1;j++){
if(isSimplest(j,i+1)){
i%2?f.a=-j:f.a=j;
f.b=i+1;
v.push_back(f);
}
}
for(int j=i+1;j>=1;j--){
if(isSimplest(i,j)){
i%2?f.a=-i:f.a=i;
f.b=j;
v.push_back(f);
}
}
}
int a,b;
while(cin>>a>>b){
for(int i=0;i<v.size();i++){
if(v[i].a==a && v[i].b==b)
cout<<i<<endl;
}
}
}