Description
你有一个随机数生成器,给定一个
0
≤
x
≤
n
−
1
0\le x\le n-1
0≤x≤n−1 的整数作为随机种子,这个随机数生成器会每次输出
x
x
x 并将
x
k
m
o
d
  
n
xk\mod{n}
xkmodn 作为新的
x
x
x。你很快发现这个随机数生成器很渣。为了证明它很渣,你想要求出有多少个随机种子,使得这个随机数生成器会输出初始种子无穷多次。
Input
输入一行两个正整数n和k。
n
≤
1
0
18
,
k
≤
1
0
18
n\le10^{18},k\le10^{18}
n≤1018,k≤1018
Output
输出一个数表示答案。
Sample Input
10 2
Sample Output
4
对于 k r x ≡ x ( m o d n ) k^rx\equiv x\pmod{n} krx≡x(modn) 其中 0 ≤ x < n 0\le x<n 0≤x<n , 1 < r < n 1<r<n 1<r<n 求合法整数解 x x x 的个数。
变形为
k
r
(
x
,
n
)
≡
(
x
,
n
)
(
m
o
d
n
)
k^r(x,n)\equiv(x,n)\pmod{n}
kr(x,n)≡(x,n)(modn)
也就是求使
k
r
≡
1
(
m
o
d
n
(
x
,
n
)
)
k^r\equiv1\pmod{\frac{n}{(x,n)}}
kr≡1(mod(x,n)n) 有解的
x
x
x 的个数并加上
x
=
0
x=0
x=0 的情况。
这个东西有解当且仅当
(
k
,
n
(
x
,
n
)
)
=
1
(k,\frac{n}{(x,n)})=1
(k,(x,n)n)=1
也就是
(
k
,
n
)
∣
(
x
,
n
)
(k,n)|(x,n)
(k,n)∣(x,n) 即
(
k
,
n
)
∣
x
(k,n)|x
(k,n)∣x
变换为求满足
(
k
,
n
)
∣
x
(k,n)|x
(k,n)∣x 的
x
x
x 个数,显然为
⌊
n
−
1
(
k
,
n
)
⌋
\lfloor\frac{n-1}{(k,n)}\rfloor
⌊(k,n)n−1⌋
但是呢,我觉得可能是题面出了点偏差
题意跟我想象的 不太一样 (?)
所以下面的代码蛙了
所以我跑了(
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long n, k;
long long gcd(long long a, long long b)
{
return !b?a:gcd(b,a%b);
}
int main()
{
scanf("%lld%lld", &n, &k);
printf("%lld", (n - 1) / gcd(n, k) + 1);
return 0;
}