好虐心的一题。
直接开int128了,懒得逆元,求助看哪里计算有误或者没有取模,一个下午除了被USACO薄纱之外就调这题了/kk
//Author: Velvet on Luogu(uid=443675)
#include <bits/stdc++.h>
#define int __int128
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
inline int lowbit(int x) {return x&(-x);}
const int mod=19940417;
int calc(int x,int y){
int rt=0;
for(int l=1,r;l<=y;l=r+1){
r=x/(x/l);r=min(r,y);
rt+=(r-l+1)*(l+r)/2*(x/l);
rt%=mod;
}
return rt;
}
int sum(int n){return n%mod*(n+1)%mod*(2*n+1)%mod;}
signed main(){
int n=read(),m=read();
if(m<n) swap(n,m);
int a=n*n%mod-calc(n,n);
// for(int i=1;i<=n;i++) a-=i*(n/i)%mod;
int b=m*m%mod-calc(m,m);
// for(int i=1;i<=m;i++) b-=i*(m/i)%mod;
a=(a%mod+mod)%mod;b=(b%mod+mod)%mod;
int ans=a*b%mod; //前半部分
ans=((ans%mod-n*n%mod*m%mod+n*calc(m,n)%mod+m*calc(n,n)%mod)%mod+mod)%mod;
for (int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
ans=(ans-(n/l)*(m/l)%mod*(sum(r)-sum(l-1))%mod)%mod;
}
writeln((ans%mod+mod)%mod);
return 0;
}