【JZOJ5250】【GDOI2018模擬】質數(數論)

Description

這裏寫圖片描述

Solution

要求2f(i) 可以考慮狄利克雷卷積一下,或者討論一下其中的性質。
對於所有不同的質因子,然後再2的次冪一下,很明顯可以知道是選與不選的問題。
那麼要求2f(i) 就相當於求j|i[gcd(j,i/j)==1]
我們要求gcd爲1的個數可以考慮容斥一下。
那麼上式就轉化成j|id|gcd(j,i/j)μ[d]
我們先枚舉d,設ik=j,因爲d|i/j ,所以d2|ik
那麼式子變成d2|iμ[d]id2k=1[d2k|i]
然後後面的式子就變成d2|iμ[d]g(id2)
g(i)表示i的約數個數
然後再把d提出來式子就變成
nd=1μ[d]nd2k=1g(d2kd2)
式子等於nd=1μ[d]nd2k=1nd2k
然後直接暴力就好了

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);
}
發佈了433 篇原創文章 · 獲贊 631 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章