题目描述
输入描述
输出描述
样例输入
2
105 38
1 114
样例输出
4 2 1 3 4 2
1 0 114
样例解释
简单签到数学题,给定一个互质的分式,拆成任意如题所示的公式即可。
赛时潦草看题的时候:草(一种植物),数论题?迅速跳过。
十分钟后一看榜单:噫
本题模拟一遍样例即可知道过题方法:
105 / 38 = 2 … 29
38 / 29 = 1 … 9
29 / 9 = 3 … 2
9 / 2 = 4 … 1
其中每个公式中的商即为答案,直接丢入数组即可。而余数与除数将组成下一个分式,注意倒数需要 swap ;
而当某个运算式得到的余数为 1 时,直接将除数载入答案并 break 即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int N=1e5+10;
int main(){
int t;
cin>>t;
while(t--){
int a[N];
int n,m;
cin>>n>>m;
int cnt=0;
if(n==1||m==1){
if(n==1){
cout<<1<<" "<<0<<" "<<m<<endl;
}
if(m==1)
cout<<1<<" "<<0<<" "<<n<<endl;
continue;
}
while(n>1&&m>1){
a[cnt++]=n/m;
n=n%m;
swap(n,m);
}
if(n==1)
a[cnt]=m;
if(m==1)
a[cnt]=n;
cout<<cnt<<" ";
for(int i=0;i<=cnt;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}