显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define int long long
using namespace std;
const int MAXN = 10000007;
const int MOD = 998244353;
int read(){
int w=1,x=0,ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')w=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*w;
}
bool isprime[MAXN];
int prime[MAXN],phi[MAXN],n,m,cnt;
void Euler(int n){
memset(isprime,true,sizeof(isprime));
phi[1]=1;
for(int i=2;i<=n;i++){
if(isprime[i]){
prime[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt;j++){
if(prime[j]*i>n)break;
isprime[i*prime[j]]=false;
if((i%prime[j])==false){
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
else phi[i*prime[j]]=(prime[j]-1)*phi[i];
}
}
}
int ans=0;
signed main(){
freopen("hoip.in","r",stdin);
freopen("hoip.out","w",stdout);
n=read(),m=read();
Euler(MAXN-1);
for(int d=1;d<=min(n,m);d++)ans+=phi[d]*(n/d)%MOD*(m/d)%MOD,ans%=MOD;
printf("%lld",ans);
return 0;
}