D e s c r i p t i o n Description Description
I n p u t Input Input
O u t p u t Output Output
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
T r a i n Train Train o f of of T h o u g h t Thought Thought
我们先特判几种情况
当
m
=
=
1
m == 1
m==1时只有一个人,那么
n
n
n就可以全部分给一个人
当
n
=
=
1
n == 1
n==1时只有一个火腿,那么就分成
1
/
n
1/n
1/n份,就切
n
−
1
n-1
n−1刀
当
n
%
m
=
=
1
n \% m ==1
n%m==1时,一个人正好可以分到
n
/
m
n / m
n/m个火腿
然后 我们可以把
n
n
n和
m
m
m简化一下(以下出现的
/
/
/号均需向下取整)
当
n
>
m
n>m
n>m时,m个人是可以分到
n
/
m
n/m
n/m个
然后就变成了
n
−
n
/
m
∗
m
n - n / m * m
n−n/m∗m个火腿分给
m
m
m个人
设
k
=
n
−
n
/
m
∗
m
k = n - n / m * m
k=n−n/m∗m
所以现在每个人只能分到
k
/
m
k/m
k/m
其实可以想象把
k
k
k个火腿拼成一个
然后在每
k
/
m
k/m
k/m的地方砍一刀
然后砍了
m
−
1
m-1
m−1刀后
就有了
m
m
m块了
嗯就是这么简单
注:
还可以用GCD简化
n
,
m
n,m
n,m
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
int T, n, m, k;
int Gcd(int a, int b)
{return b ? Gcd(b, a % b) : a;}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
if(n > m)n = n - n / m * m;
k = Gcd(n, m); n /= k, m /= k;
if(m == 1)
{printf("0\n");
continue;}
if(n == 1)
{printf("%d\n", (m - 1) * k);
continue;}
if(!(n % m))
{printf("0\n");
continue;}
ll Ans = (m - 1) * k;//因为前面n,m简化了,最后答案还要乘上
printf("%d\n", Ans);
}
return 0;
}