[CCPC2024 重庆站] 有限小数 题解
回顾一下有限小数的定义:转换成分数并约分之后,分母必然为
设
::::info[证明]
若存在质因数内不含
::::
求出
枚举
问题转换为求
放代码:
#include<bits/stdc++.h>
using namespace std;
const int V=1e9;
pair<int,int> exgcd(int a,int b){
if(!b)return make_pair(1,0);
auto [x,y]=exgcd(b,a%b);
return make_pair(y,x-a/b*y);
} // 扩展欧几里得算法
inline int inv(int x,int m){
return (exgcd(x,m).first%m+m)%m;
} // 求乘法逆元
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin>>t;
while(t--){
int a,b,r; cin>>a>>b,r=b;
while(!(r&1))r>>=1;
while(!(r%5))r/=5;
int q=(r-inv(b/r%r,r))%r;
// 在外面提前计算出 b/r 的乘法逆元
// 这里取了个相反数,这样里面就可以不用考虑那个负号
// 也就是说这里的 q 相当于文章中的 q 的乘法逆元的相反数
pair<int,int> rs(V,0);
for(int d2=1;1ll*d2*r<=V;d2<<=1)
for(int d5=1;1ll*d2*d5*r<=V;d5*=5){
int p=d2*d5,d=p*r,c=1ll*q*a%r*p%r;
rs=min(rs,make_pair(c,d));
} // 暴力枚举 d,套公式算 c
cout<<rs.first<<' '<<rs.second<<'\n';
}
return 0;
}