「LibreOJ β Round #4」求和 莫比烏斯函式
阿新 • • 發佈:2019-02-13
不含平方因子的數才會有 -1 和 1才會對結果造成影響,
所有排除掉所有含有平方因子的數就好
開始的時候平方是1 就是沒有平方因子的情況,減去所有平方因子的情況
#include <bits/stdc++.h>
using namespace std;
const int maxn=10000001;
bool vis[maxn+10];
int prime[maxn+10],mu[maxn+10];
int cnt;
typedef long long ll;
const ll mod = 998244353;
int sum[maxn];
void Init(){
int N=maxn;
memset(prime,0,sizeof(prime));
memset(mu,0,sizeof(mu));
memset(vis,0,sizeof(vis));
mu[1] = 1;
cnt = 0;
for(int i=2; i<N; i++){
if(!vis[i]){
prime[cnt++] = i;
mu[i] = -1;
}
for(int j=0; j<cnt&&i*prime[j]<N; j++){
vis[i*prime[j]] = 1 ;
if(i%prime[j]) mu[i*prime[j]] = -mu[i];
else{
mu[i*prime[j]] = 0;
break;
}
}
}
sum[0]=0;
for(int i=1;i<N;i++)
sum[i]=sum[i-1]+mu[i];
}
int main()
{
ll n,m;
Init();
scanf("%lld%lld" ,&n,&m);
ll mii=min(n,m);
ll ans=0;
for(ll i=1;i*i<=mii;i++)
{
ll t1=n/(i*i);
ll t2=m/(i*i);
t1%=mod;
t2%=mod;
ans=(ans+(t1*t2*mu[i]+mod)%mod+mod)%mod;
}
printf("%lld\n",ans );
}