题目链接
(ps:这是一道权限题…)
计算
根本不会的说…
然后去看po姐博客就一脸懵逼辣…
以下摘自popoqqq博客,并加上蒟蒻的辣鸡理解…
单独考虑最后一个和式
然后分开考虑每一个独立的和式。
令 d=gcd(n,m) ,这个变量将贯穿整篇博客。
对于第二个和式:
对于第三个和式,化简的过程与第一个和式的部分相似。
接着,我们来整理一下这些柿子:
然后我们就枚举 d ,然后用经典的莫比乌斯反演求一下 gcd(i,j)==d(1<=i<=N,1<=j<=M) 的个数
#include
#include
#define LL long long int
#define mod 998244353
#define MAXN 500005
using namespace std;
int n, m, prime[MAXN], tot;
LL u[MAXN];
bool flag[MAXN];
double x;
inline void init()
{
u[1]=1;
for(int i=2, j, k;iif(!flag[i])prime[++tot]=i, u[i]=-1;
for(j=1;j<=tot&&(k=i*prime[j])1;
if(i%prime[j]==0){u[k]=0;break;}
u[k]=-u[i];
}
}
for(int i=1;i1]+mod+mod)%mod;
}
LL sum(LL n){return n*(n+1)/2%mod;}
int main()
{
init();
scanf("%d%d%lf",&n,&m,&x);
LL ans=((sum(n)*sum(m)-n*sum(m)-m*sum(n))%mod+mod)%mod, k;
if(n>m)swap(n,m);
for(int i=1, nn, mm, last;i<=n;++i)
{
k=i+int(x/i)*i*2;
nn=n/i, mm=m/i;
for(int j=1;j<=nn;j=last+1)
{
last=min(nn/(nn/j),mm/(mm/j));
ans=(ans+k*(u[last]-u[j-1])%mod*(nn/j)%mod*(mm/j))%mod;
}
}
cout<*499122177%mod<<'\n';
return 0;
}