题目链接:
BAPC 2014 Preliminary A Choosing Ice Cream
题意概括:
现在有n个冰激凌,需要从中选一个。给一个k面的骰子,问最少需要投几下可以得到一个方案,通过分配基本事件,使n个冰激凌的概率相同。若无法达到概率相同,则输出"unbounded"。
数据范围:
1 ≤ n, k ≤ , 测试数据最多100组。
题解分析:
投掷1次得到k个基本事件,2次得到 个,x次得到
个。若可以把全体基本时间平均映射(分配)到n,则说明可以达到概率相同。所以只要求满足等式
的x的最小值便可以。此时我们只需要从k开始,不断地进行累乘,满足等式时停止。当然,我们可以发现累乘的次数存在上限。由于数据范围是1 ≤ n, k ≤
,所以最多累乘次数是
,说明只要次数超过了29次,就无法通过累乘满足等式,输出"unbounded"。有一个需要注意的地方:当
时,不需要判断,直接输出0便可以。
AC代码:
#include <stdio.h>
using namespace std;
int main () {
int N;
scanf("%d", &N);
while (N--) {
int n, k;
scanf("%d%d", &n, &k);
long long sum = k; //不用long long会WA
int cnt = 1;
while (sum % n && cnt <= 29) {
sum = sum * k % n;
cnt ++;
}
if (n == 1) printf("0\n");
else if (cnt <= 29) printf("%d\n", cnt);
else printf("unbounded\n");
}
}