1 条题解

  • -2
    @ 2024-1-11 10:30:29
    思路

    情况分为 3 种:

    第 1 种情况,当 n=1 或 m=1 的时候,显然只能选到一个算法所以肯定会结束。

    第 2 种情况,当 n≤m 的时候,我们可以让 n 个人每一轮都各自选择 n 种不同的算法,这样的话就能每轮都保留n种算法,投票就不会结束。

    第 3 种情况,当 n < m 的时候,我们如果能够找到一个 n 的因数 x,并满足 2≤x≤m 即可。就可以在第一轮时选择 x 个算法,然后一直平均分配票数,投票就永远不会结束。 所以只需要判断一下 n 能不能分解出来一个比 m 小的因数即可。

    由于题目询问次数很多,所以我们可以使用线性筛,预处理出2~1000000范围中,每个数的最小因数,并记录,主函数中根据三种情况进行判断并输出即可。

    参考代码
    //预处理出数据范围内,每个数最小的因数保存在f数组里
        memset(f, 0x3f, sizeof(f));
        for (int i = 2; i <= 1000000; ++i)
            if (f[i] == 0x3f3f3f3f)
    	{
    	    for (int j = i; j <= 1000000; j += i)
    		f[j] = min(i, f[j]);
    	}
    
    • 1

    信息

    ID
    645
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    188
    已通过
    34
    上传者