题解:P11637 Mod
题目传送门
思路
一种比较简单的方法。
根据题意,我们可以发现在若干次操作后 \(a\) 能变成 \(0\) 的情况下,操作次数为 \(p-a\)。因为 \(b\) 的操作次数与 \(a\) 相同,所以 \(b\) 的值为 \(b-(p-a)\)。因为题面中要求 \(b\) 为一个自然数,所以自然就分成了 \(b-(p-a) \ge 0\) 和 \(b-(p-a) < 0\) 两种情况。在第二种情况下,如果进行操作,就与题面中的 \(b \ge 0\) 相悖,所以无需进行任何操作,\(a\) 和 \(b\) 本身即为他们的最小值。对应地,在第一种情况下,\(a\) 的最小值即为 \(0\)。当经过 \(p-a\) 次操作下后,再每进行 \(p\) 次操作后 \(a\) 会再次等于 \(0\)。所以可以求出此时 \(b\) 的最小值。
综上所述:
- 当 \(b-(p-a) \ge 0\) 时,\(a_{min}=0\),\(b_{min}=b-(p-a)\bmod p\)。
- 当 \(b-(p-a) < 0\) 时,\(a_{min}=a\),\(b_{min}=b\)。
对于一种情况 \(b-(p-a) \ge 0\) 和第二种情况 \(b-(p-a) < 0\) 的样例模拟:
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,p;
int main(){cin>>a>>b>>p;if((b-(p-a))>0||(b-(p-a))==0) cout<<"0"<<" "<<(b-(p-a))%p;else cout<<a<<" "<<b;return 0;
}