L i n k Link Link
D e s c r i p t i o n Description Description
S a m p l e Sample Sample I n p u t Input Input
2
2 6
6 2
S a m p l e Sample Sample O u t p u t Output Output
4
0
H i n t Hint Hint
S o l u t i o n Solution Solution
对于题目要求,可以分成两段,具体如下图
整分的部分是不需要切的(但是可能没有这段),而后面则需要切
我这样的思路是等于把所有火腿连接起来看成一条火腿,那这样就很简单了
不过可以搞搞特判,也可以整一手
g
c
d
gcd
gcd,只不过最后求值的时候要乘回来
C o d e Code Code
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n, m, T;
ll gcd(ll n, ll m)
{
if (m == 0) return n;
else return gcd(m, n % m);
}
int main()
{
scanf("%d", &T);
for (int i = 1; i <= T; ++i)
{
scanf("%lld%lld", &n, &m);
if (n > m) n = n - n / m * m;//减去可以整分的那段
ll p = gcd(n, m);
n /= p; m /= p;
if (n == 1) {
printf("%lld\n", (ll)(m - 1) * p);
continue;
}//只有一根火腿那肯定得砍m - 1刀分成m份
if (m == 1) {
printf("0\n");
continue;
}//只有一个人全部给他就好了,不需要切
ll ans = (m - 1) * p;
printf("%lld\n", ans);
}
return 0;
}