思路
好的,乍一看可以暴力枚举,但本蒟蒻不会。打这场赛时,我在上课,然后我灵机一动,如果 \(x \times a - b \ge x\) 就直接输出 \(x\),否则输出 \(x \times a - b\),结果拿了个 20 分,我也没多想。在经过一些思考和寻求帮助后,我发现,\(a = 0\) 或 \(a = 1\) 时,要有个特判:
- \(a = 0\) 时,看看 \(x\) 和 \(-b\) 谁最小输出谁。
- \(a = 1\) 时,如果 \(b = 0\) ,输出 \(x\),否则输出 \(x \bmod b + b\)。
- \(x \times a - b \ge x\) 时,和上面一样,输出 \(x\)。
- \(x \times a - b < x\) 时,刚刚我写了输出 \(x \times a - b\),对了一半,怎么回事呢,经过参考和对拍,我找到了反例,所以还要循环枚举最小值。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){int t;cin>>t;while(t--){long long x,a,b;cin>>x>>a>>b;if(a==0) cout<<min(x,-b)<<endl;//第一种情况else{if(a==1){//第二种情况if(b==0) cout<<x<<endl;else cout<<x%b-b<<endl;}else{if(a*x-b>=x){//第三种情况cout<<x<<endl;}else{//第四种情况int temp=x*a-b;while(x>=0&&temp<x){x=x*a-b;temp=x*a-b;}cout<<x<<endl;}}}}return 0;
}