题解:P10252 线性变换
P10252 线性变换
做这题的时候矛盾了很久。
审题:
给出三个非负整数
- 将
x 变为ax - b 。
求通过操作能得到的
分析样例:
第一组:
输入:
6 2 4
输出:
6
手动模拟得操作数为
第二组:
输入:
5 3 16
输出:
-1
手动模拟得操作数为
分析做法:
通过题目:将
设第一次增加的值为正整数
那么这一次的
下一次操作后就变化成
由于
所以当
根据我们刚才所得出的结论,我们可以通过判断第一次操作所变化的值,判断
如果是递增,由于我们需要找的为最小值,所以选择不操作,这种就是样例中第一组的情况。
那如果是递减,那么我们就可以选择直接模拟至
接下来就是判断几个特殊情况。
首先,是
当
然后就是当
当这种情况出现时,很显然,答案就是等于
处理矛盾:
我矛盾了很久的原因是不知道为什么可以直接模拟,难道不会超时吗?
其实可以发现,在排去特殊情况时,操作数一般都比较少,因为符合递减的情况下,
实现:
#include<bits/stdc++.h>
using namespace std;
long long T,x,a,b;
int main(){
cin>>T;
while(T--)
{
cin>>x>>a>>b;
if(a==0 || x==0) x=-b; //分类讨论:x=0 并且 a=0 的情况。
else if((a-1)*x>=b) x=x; //分类讨论:递增的情况。
else if(a==1) x=x%b-b; //分类讨论:a=1的情况。
else while(x>=0) x=x*a-b; //分类讨论:正常情况。
cout<<x<<endl;
}
return 0;
}
感谢管理员的审核!