思路
对 a n + 1 a_{n+1} an+1 进行讨论:
-
a
n
+
1
=
0
a_{n+1}~=~0
an+1 = 0
此时 k = 1 k~=~1 k = 1 -
0
<
a
n
+
1
≤
m
i
n
(
n
,
m
)
0 < a_{n+1}\le min(n,~m)
0<an+1≤min(n, m)
此时 k = 2 k~=~2 k = 2 -
n
<
a
n
+
1
≤
m
i
n
(
n
,
m
)
n < a_{n+1}\le min(n,~m)
n<an+1≤min(n, m)
-
a
n
+
1
m
o
d
n
=
0
a_{n+1}~mod~n~=~0
an+1 mod n = 0
此时 k = 2 k~=~2 k = 2 -
a
n
+
1
m
o
d
n
≠
0
a_{n+1}~mod~n~≠~0
an+1 mod n = 0
此时 0 < a n < n 0 < a_{n} < n 0<an<n。记 n n = n − 1 nn~=~n-1 nn = n−1,那么这个式子等价于 0 < a n n + 1 < n n + 1 0 < a_{nn+1} < nn+1 0<ann+1<nn+1,即 0 < a n n + 1 < n n 0 < a_{nn+1} < nn 0<ann+1<nn。把 n n nn nn 当做一个测试样例中的“n”,即 0 < a n + 1 < n 0 < a_{n+1} < n 0<an+1<n,根据结论“2”可知 k = 2 k~=~2 k = 2。综上所述,整体的 k k k 等于 3 3 3。
-
a
n
+
1
m
o
d
n
=
0
a_{n+1}~mod~n~=~0
an+1 mod n = 0
由于 a i n + 1 a_{in+1} ain+1 的值是从 [ 0 , m ] [0,~m] [0, m] 中选取的,为了求出答案,我们再对 k k k 讨论:
-
k
=
1
k~=~1
k = 1
只有在 m = 0 m~=~0 m = 0, a n + 1 = 0 a_{n+1}~=~0 an+1 = 0的时候满足,则 r e s = 1 res~=~1 res = 1 -
k
=
2
k~=~2
k = 2
如果 m ≤ n m~\le~n m ≤ n, r e s = m res~=~m res = m;如果 m > n m~>~n m > n, r e s = n + ( m − n ) / n res=n+(m-n)/n res=n+(m−n)/n -
k
=
3
k~=~3
k = 3
如果 m < n m<n m<n, r e s = 0 res~=~0 res = 0;如果 m ≥ n m\ge n m≥n, r e s = m − n − ( m − n ) / n res=m-n-(m-n)/n res=m−n−(m−n)/n -
k
>
3
k~>~3
k > 3
根据上边分析可知不存在 k > 3 k~>~3 k > 3 的情况,即 r e s = 0 res~=~0 res = 0
C o d e Code Code
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;
int n, m, k;
void solve() {
cin >> n >> m >> k;
cout << " ";
if (k == 1) { // 只有在a[n + 1] = 0的时候才满足
cout << "1\n";
} else if (k == 2) {
if (m <= n) {
cout << m << "\n";
} else { // m > n
cout << n + (m - n) / n << "\n";
}
} else if (k == 3) {
if (m <= n) {
cout << "0\n";
} else { // m > n
cout << m - n - (m - n) / n << "\n";
}
} else {
cout << "0\n";
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T; cin.get();
while (T --) solve();
return 0;
}