Description
N,M<=10^15
Solution
首先需要知道一个结论,若
n%k+m%k≥k
n
%
k
+
m
%
k
≥
k
,则
⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1
⌊
n
+
m
k
⌋
−
⌊
n
k
⌋
−
⌊
m
k
⌋
=
1
证明如下:
显然可以设
n=a1k+r1
n
=
a
1
k
+
r
1
,
m=a2k+r2
m
=
a
2
k
+
r
2
,那么
⌊n+mk⌋=a1+a2+1
⌊
n
+
m
k
⌋
=
a
1
+
a
2
+
1
,
⌊nk⌋=a1
⌊
n
k
⌋
=
a
1
,
⌊mk⌋=a2
⌊
m
k
⌋
=
a
2
因为
r1+r2≥k
r
1
+
r
2
≥
k
因此
⌊r1+r2k⌋=1
⌊
r
1
+
r
2
k
⌋
=
1
现在令
t=∑n%k+m%k≥kφ(k)
t
=
∑
n
%
k
+
m
%
k
≥
k
φ
(
k
)
,显然答案就是
φ(n)∗φ(m)∗t
φ
(
n
)
∗
φ
(
m
)
∗
t
那么有
t=∑n%k+m%k≥kφ(k)=∑n+mk=1φ(k)[⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1]
t
=
∑
n
%
k
+
m
%
k
≥
k
φ
(
k
)
=
∑
k
=
1
n
+
m
φ
(
k
)
[
⌊
n
+
m
k
⌋
−
⌊
n
k
⌋
−
⌊
m
k
⌋
=
1
]
我们发现后面那一坨布尔表达式不为0就为1,那么有
t=∑n+mk=1φ(k)(⌊n+mk⌋−⌊nk⌋−⌊mk⌋)
t
=
∑
k
=
1
n
+
m
φ
(
k
)
(
⌊
n
+
m
k
⌋
−
⌊
n
k
⌋
−
⌊
m
k
⌋
)
,可以感受一下区别
那么拆一下就成了
t=∑n+mk=1φ(k)⌊n+mk⌋−∑nk=1φ(k)⌊nk⌋−∑mk=1φ(k)⌊mk⌋
t
=
∑
k
=
1
n
+
m
φ
(
k
)
⌊
n
+
m
k
⌋
−
∑
k
=
1
n
φ
(
k
)
⌊
n
k
⌋
−
∑
k
=
1
m
φ
(
k
)
⌊
m
k
⌋
考虑一下
∑nk=1φ(k)⌊nk⌋
∑
k
=
1
n
φ
(
k
)
⌊
n
k
⌋
的意义,有
∑nk=1φ(k)⌊nk⌋=∑nk=1∑⌊nk⌋i=1φ(k)=∑ni=1∑k|iφ(k)=∑ni=1i
∑
k
=
1
n
φ
(
k
)
⌊
n
k
⌋
=
∑
k
=
1
n
∑
i
=
1
⌊
n
k
⌋
φ
(
k
)
=
∑
i
=
1
n
∑
k
|
i
φ
(
k
)
=
∑
i
=
1
n
i
辣莫
t=12[(n+m)(n+m+1)−n(n+1)−m(m+1)]=nm
t
=
1
2
[
(
n
+
m
)
(
n
+
m
+
1
)
−
n
(
n
+
1
)
−
m
(
m
+
1
)
]
=
n
m
即
ans=φ(n)∗φ(m)∗nm
a
n
s
=
φ
(
n
)
∗
φ
(
m
)
∗
n
m
惊喜不惊喜,意外不意外
Code
#include <stdio.h>
#include <string.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
typedef long long LL;
const int MOD=998244353;
void cal(LL &ret,LL x) {
ret=ret/x;
ret=ret*(x-1);
}
LL get_phi(LL n) {
LL ret=n;
for (LL i=2;i*i<=n;i++) {
if (n%i) continue;
cal(ret,i);
while (n%i==0) n/=i;
}
if (n!=1) ret=(ret/n)*(n-1);
return ret;
}
int main(void) {
LL n,m; scanf("%lld%lld",&n,&m);
printf("%lld\n",n%MOD*m%MOD*(get_phi(m)%MOD)%MOD*(get_phi(n)%MOD)%MOD);
return 0;
}