题意
n,m<=1015
n
,
m
<=
10
15
分析
大佬们好强啊%%%
nmodk+mmodk>=k可以变形成⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1 n mod k + m mod k >= k 可 以 变 形 成 ⌊ n + m k ⌋ − ⌊ n k ⌋ − ⌊ m k ⌋ = 1
ans=∑n+mk=1ϕ(k)∗⌊n+mk⌋−∑nk=1ϕ(k)∗⌊nk⌋−∑mk=1ϕ(k)∗⌊mk⌋ a n s = ∑ 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=1k=∑nk=1∑i|kϕ(i)=∑nk=1ϕ(k)∗⌊nk⌋ ∑ k = 1 n k = ∑ k = 1 n ∑ i | k ϕ ( i ) = ∑ k = 1 n ϕ ( k ) ∗ ⌊ n k ⌋
那么可以得到ans=ϕ(n)∗ϕ(m)∗n∗m 那 么 可 以 得 到 a n s = ϕ ( n ) ∗ ϕ ( m ) ∗ n ∗ m
请收下蒟蒻的膝盖%%%
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const LL MOD=998244353;
LL get_phi(LL n)
{
LL ans=n,w=sqrt(n);
for (LL i=2;i<=w;i++)
if (n%i==0)
{
ans=ans/i*(i-1);
while (n%i==0) n/=i;
}
if (n>1) ans=ans/n*(n-1);
return ans%MOD;
}
int main()
{
LL n,m;
scanf("%lld%lld",&n,&m);
printf("%lld",(LL)get_phi(n)*get_phi(m)%MOD*(n%MOD)%MOD*(m%MOD)%MOD);
return 0;
}