1. 程式人生 > >「LibreOJ β Round #4」求和 莫比烏斯函式

「LibreOJ β Round #4」求和 莫比烏斯函式

這裡寫圖片描述

不含平方因子的數才會有 -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 ); }