题目传送门
思路
硬导题。
因为 \(c=\lfloor \frac{b}{m}\rfloor\),那么 \(b\) 一定可以表示为 \(c\times m+x\),其中 \(0\le x\le m-1\)。
又因为 \(b=\lfloor \frac{a}{n}\rfloor\),那么 \(a\) 一定可以表示为 \(b\times n+y\),其中 \(0\le y\le n-1\)。
由上可以得出:
\[b=cm+x \]\[a=bn+y \]所以:
\[b=\frac{a-y}{n} \]所以:
\[\frac{a-y}{n}=cm+x \]\[\therefore a=cmn+nx+y \]由于 \(a,c,m,n,x,y\in N\) 且 \(m\) 和 \(n\) 不为 \(0\),所以 \(a\ge c\)。
考虑分类讨论:
-
\(a<c\) 时:因为若有解,那么 \(a\) 一定不小于 \(c\),所以此时无解。
-
\(a=c\) 时:很容易可以得出当 \(m=n=1\) 时,一定满足 \(a=b=c\),所以一个合法 \(b\) 的值就等于 \(a\) 和 \(c\)。
-
\(a>c\) 时:重新考虑上述方程,即 \(a=cmn+nx+y\):因为 \(x\le m-1,y\le n-1\),所以 \(nx+y\le n(m-1)+n-1\),所以 \(nx+y\le mn-1\),所以再设 \(z=nx+y\),所以 \(0\le z\le mn-1\),代入方程,可得: \(a=cmn+z\),再令 \(mn=f\),所以 \(a=cf+z\),其中 \(0\le z\le f-1\)。此时我们只需要考虑 \(f\) 存不存在正整数解即可。
(判断 \(f\) 有没有正整数解很简单,用贪心的思想,我们可以要求 \(f\) 尽可能大,也就是让 \(f=\lfloor\frac{a}{c}\rfloor\),然后判断 \(a-cf\) 与 \(f\) 的大小即可,具体见代码。)
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
int a,c;cin>>a>>c;
if(a==c)cout<<a<<endl;
else if(a<c)cout<<-1<<endl;
else{
int f=a/c;int u=a-c*f;
if(u>=f)cout<<-1<<endl;
else cout<<c<<endl;
}
}
return 0;
}
标签:lfloor,le,frac,cout,所以,题解,T2,J1,nx
From: https://www.cnblogs.com/snapyust/p/18301962