题目大意
设S(n,m)为满足m mod k+n mod k≥k的所有整数k组成的集合。
例如
给定n,
φ(n)φ(m)∑k∈S(n,m)φ(k)
答案对998244353取模。
1≤n,m≤1015
题目分析
这题结论很简单但是推起来要一定技巧性。
[m mod k+n mod k≥k]=[m−⌊mk⌋k+n−⌊nk⌋k≥k]=[⌊n+mk⌋−⌊mk⌋−⌊nk⌋≥1]
注意到0≤⌊n+mk⌋−⌊mk⌋−⌊nk⌋≤1。
忽略前面乘的φ(n)φ(m),原式变为
∑k=1n+m⌊n+mk⌋φ(k)−∑k=1m⌊mk⌋φ(k)−∑k=1n⌊nk⌋φ(k)
那么∑nk=1⌊nk⌋φ(k)是啥呢?和杜教筛那条式子挺像的:
∑k=1nk=∑k=1n∑d|kφ(d)=∑k=1n⌊nk⌋φ(k)
也就是说后面那个东西其实就是
∑k=1n+mk−∑k=1nk−∑k=1mk=nm
然后就是瞎求一下欧拉函数做完了。
时间复杂度O(n√)或者O(n√lnn√) (相信没有人蛋疼到去打后面那个)。
代码实现
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int P=998244353;
LL n,m;
LL phi(LL x)
{
LL ret=x,cur=x;
for (int i=2;1ll*i*i<=x&&cur>1;++i)
if (!(cur%i))
{
(ret/=i)*=(i-1);
for (;!(cur%i);cur/=i);
}
if (cur>1) (ret/=cur)*=(cur-1);
return ret;
}
int main()
{
freopen("math.in","r",stdin),freopen("math.out","w",stdout);
scanf("%lld%lld",&n,&m),printf("%d\n",1ll*(phi(n)%P)*(phi(m)%P)%P*(n%P)%P*(m%P)%P);
fclose(stdin),fclose(stdout);
return 0;
}