Description
Solution
要求
對於所有不同的質因子,然後再2的次冪一下,很明顯可以知道是選與不選的問題。
那麼要求
我們要求gcd爲1的個數可以考慮容斥一下。
那麼上式就轉化成
我們先枚舉d,設ik=j,因爲
那麼式子變成
然後後面的式子就變成
g(i)表示i的約數個數
然後再把d提出來式子就變成
式子等於
然後直接暴力就好了
Code
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=1e6+7,mo=998244353;
ll i,j,k,l,t,m,ans,q,n,r;
int er[21],p[maxn],mu[maxn],s[maxn];
bool bz[maxn];
int main(){
// freopen("fan.in","r",stdin);
fo(i,2,maxn-7){
if(!bz[i])p[++p[0]]=i,mu[i]=-1;
fo(j,1,p[0]){
t=p[j]*i;if(t>maxn-7)break;
bz[t]=1;if(i%p[j]==0){break;}
mu[t]=-mu[i];
}
}
mu[1]=1;
scanf("%lld",&n);
fo(i,1,sqrt(n)){
q=0;t=n/(i*i);
l=1;
while(l<=t){
r=t/(t/l);
q=(q+(r-l+1)*(t/l))%mo;
l=r+1;
}
ans=(ans+mu[i]*q)%mo;
}
ans=(ans+mo)%mo;
printf("%lld\n",ans);
}