这题一看就是算概率,把题意弄懂后,顺利推出公式,x*1/(n/mx) = mx*x/n.
因为精度wa了一次= =,然后输出少了空格PE了一次,额...
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define int64 long long int64 n, m, x; #define INF 21623 int64 gcd(int64 a, int64 b) { return b==0? a: gcd(b, a%b); } int64 getx(int64& mx) { int64 ans = 1; int64 tn = n; int64 tm = m; while(tm<tn) { //printf("%d*%d=%d\n", tm, tm*tm); if((int64)tm*tm>tn) { tm*=m; ans+=1; } else if((int64)tm*tm<=tn) { tm*=tm; ans*=2; } } mx = tm; return ans; } void solve(int64& a, int64& b) { int64 mx; x = getx(mx); int64 d = gcd((int64)mx*x, (int64)n); a = (int64)mx*x/d; b = n/d; } int main() { int t; cin>>t; for(int i=1; i<=t; i++) { cin>>n>>m; int64 a, b; solve(a, b); cout<<"Case "<<i<<": "<<a<<"/"<<b<<endl; } }