杂题——转圈
转圈
题目描述
小 $\delta$ 喜欢转圈圈。
他有一个圈,被均匀分成了 $n$ 个格子,神奇的是,$n$ 是一个质数。第 $i$ 个格子上写着一个数 $i \times m$,他现在站在第一个格子上。
接下来他会看看脚下踩着的数是多少,然后向前走这么多格。他会一直反复这么做。
求最终被小 $\delta$ 踩到过的格子的数量。由于小 $\delta$ 有很多圈圈,所以他会问你很多次。
输入格式
第一行包含一个正整数 $T$,代表询问次数。
对于每组询问,输入一行两个正整数 $n,m$。
输出格式
对于每次询问,输出一行一个正整数,代表被踩到的格子的数量。
样例 #1
样例输入 #1
1 |
|
样例输出 #1
1 |
|
提示
【样例解释】
以第一次询问为例,小 $\delta$ 依次经过的格子编号为 $1 \to 3 \to 4 \to 2 \to 1 \to \cdots$,因此被踩到过的格子个数为 $4$。
【数据范围】
- 对于 $20%$ 的数据,$n \le 10^3$,$T \le 2 \times 10^3$。
- 对于另外 $40%$ 的数据,$T \le 3 \times 10^3$。
- 对于另外 $40%$ 的数据,无特殊性质。
对于所有数据,$1 \le m < n \le 10^7$,$1 \le T \le 4 \times 10^5$。保证 $n$ 是质数。
思路
首先,第一步就是数学公式推导出我们跳了 k 次之后我们一共跳的各自数量$(m + 1)^{k}$,这个推导很简单,就不推导了.
紧接着,第二步我们可以很简单分析出来我们最终需要求的就是对于最小的 k 满足下列公式 $s^k≡1(mod\ n)$.
下面就是如何寻找这个数了,其实也还好,就是依次对于n - 1的质因子p检验$s^{\frac{p}{t}}$是否mod n余1,如果是则$t\ <-\ \frac{p}{t}$,最终的t就是答案了.这些质因子就需要使用线性埃式筛法来选取了.
代码
1 |
|