分火腿

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 n1
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 nn/mm个火腿分给 m m m个人
k = n − n / m ∗ m k = n - n / m * m k=nn/mm
所以现在每个人只能分到 k / m k/m k/m
其实可以想象把 k k k个火腿拼成一个
然后在每 k / m k/m k/m的地方砍一刀
然后砍了 m − 1 m-1 m1刀后
就有了 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值