放小球进箱子

一共有t个以下的问题:假设有n个箱子,分别编号为0,1,2,3……n-1;间隔为d;将小球依次放进箱子里,输出第k个小球放的的箱子编号为多少。

有两种情况,第一种是可以依次循环把所有的箱子放满:

 第二种就是循环之后会有重复的情况就会向右移动一格:

 以上两种情况的共同特点:

每d个数为一组,当通过的数为n和d的最小公倍数时,此时取的箱子向右移一位,依次类推,所以偏移位为最小公倍数的倍数。

最后的数为 第几个大格的第一个数字+偏移量

假设以上的数列放进一个数组里面

就是(k-1)*d%n   偏移量就是(k-1)*d/lcm(a,b)

最后的代码为:

#include<iostream>
#include<vector>
#include<set>
using namespace std;
#define ll long long
ll gcd(ll a, ll b) {
	return b ? gcd(b, a % b) : a;
}
ll lcm(ll a, ll b) {
	return a * b / gcd(a, b);
}
void solve() {
	ll n, d, k;
	cin >> n >> d >> k;
	cout << (k - 1) * d % n + (k - 1) * d / lcm(n, d) << endl;
}
int main() {
	int t=1;
	cin >> t;
	while (t--)
		solve();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值