BAPC 2014 Preliminary A Choosing Ice Cream [ 数论 ]

本文探讨了如何使用投掷骰子的方法来决定从n种冰激凌中选择一种的公平方式。通过数学分析确定最少投掷次数以实现概率相等的选择,并提供了详细的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

BAPC 2014 Preliminary A Choosing Ice Cream

题意概括:

现在有n个冰激凌,需要从中选一个。给一个k面的骰子,问最少需要投几下可以得到一个方案,通过分配基本事件,使n个冰激凌的概率相同。若无法达到概率相同,则输出"unbounded"。

数据范围:

1 ≤ n, k ≤ 10^{9} , 测试数据最多100组。

题解分析:

投掷1次得到k个基本事件,2次得到 k^{2} 个,x次得到 k^{x} 个。若可以把全体基本时间平均映射(分配)到n,则说明可以达到概率相同。所以只要求满足等式 k^{x}\, \, mod\, \, n=0 的x的最小值便可以。此时我们只需要从k开始,不断地进行累乘,满足等式时停止。当然,我们可以发现累乘的次数存在上限。由于数据范围是1 ≤ n, k ≤ 10^{9} ,所以最多累乘次数是 \left \lfloor \log _210^{9} \right \rfloor =29 ,说明只要次数超过了29次,就无法通过累乘满足等式,输出"unbounded"。有一个需要注意的地方:当 n=1 时,不需要判断,直接输出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");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值