题解:P10252 线性变换

思路

好的,乍一看可以暴力枚举,但本蒟蒻不会。打这场赛时,我在上课,然后我灵机一动,如果 \(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;
}
posted @ 2024-12-12 19:25  zhouxi2022HZO  阅读(30)  评论(0)    收藏  举报