一共有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;
}