记录编号 |
531961 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
[UVA 11426] [济南集训 2017] 求gcd之和 |
最终得分 |
100 |
用户昵称 |
欧鹰 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
7.263 s |
提交时间 |
2019-05-22 15:46:08 |
内存使用 |
175.78 MiB |
显示代码纯文本
#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;
}