Problem D
欧拉函数,1800
题意
求使得 g c d ( a + x , m ) = g c d ( a , m ) gcd(a+x,m)=gcd(a,m) gcd(a+x,m)=gcd(a,m) 成立的 x x x 的个数,其中 1 ≤ a < m < 1 e 10 , 0 ≤ x < m 1\leq a< m < 1e10,0\leq x<m 1≤a<m<1e10,0≤x<m 。
思路
观察样例,当
a
=
5
,
m
=
10
a=5,m=10
a=5,m=10 时,10个值分别为
[
5
,
10
]
[
6
,
10
]
[
7
,
10
]
.
.
.
[
13
,
10
]
[
14
,
10
]
[5,10][6,10][7,10]...[13,10][14,10]
[5,10][6,10][7,10]...[13,10][14,10],而其中
a
+
x
>
m
a+x>m
a+x>m 的部分可以由
g
c
d
(
a
+
x
,
m
)
=
g
c
d
(
a
+
x
−
m
,
m
)
gcd(a+x,m) = gcd(a+x-m,m)
gcd(a+x,m)=gcd(a+x−m,m) 进行转化,则10个值为
[
0
,
10
]
[
1
,
10
]
,
.
.
.
[
9
,
10
]
[0,10][1,10],...[9,10]
[0,10][1,10],...[9,10] 。
于是答案就是求
Σ
i
=
0
m
−
1
(
g
c
d
(
i
,
m
)
=
=
d
)
\Sigma_{i=0}^{m-1}(gcd(i,m)==d)
Σi=0m−1(gcd(i,m)==d) ,即
Σ
i
=
0
m
−
1
(
g
c
d
(
i
d
,
m
d
)
=
=
1
)
\Sigma_{i=0}^{m-1}(gcd(\frac{i}{d},\frac{m}{d})==1)
Σi=0m−1(gcd(di,dm)==1) ,也就是
m
d
\frac{m}{d}
dm 的欧拉函数值。
代码
void solve() {
ll a, m;
cin >> a >> m;
ll d = gcd(a, m);
cout << phi(m/d) << endl;
}