您的位置:首页 > 其它

BZOJ 2818 gcd(莫比乌斯反演)

2015-04-29 15:28 429 查看
Gcd
Time Limit:10000MS Memory Limit:262144KB 64bit IO Format:%lld
& %llu
Submit Status

Description

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的

数对(x,y)有多少对.

Input

一个整数N

Output

如题

Sample Input

4


Sample Output

4


#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<vector>
#define ll long long
#define N 10000010
using namespace std;

bool check[N+10];
int prime
;
int mu[N+10];
int tot;
int n;

void Moblus() {
    memset(check,0,sizeof check);
    mu[1]=1;
    tot=0;
    for(int i=2; i<N; i++) {
        if(!check[i]) {
            prime[tot++]=i;
            mu[i]=-1;
        }
        for(int j=0; j<tot; j++) {
            if(i*prime[j]>N)break;
            check[i*prime[j]]=1;
            if(i%prime[j]==0) {
                mu[i*prime[j]]=0;
                break;
            } else
                mu[i*prime[j]]=-mu[i];
        }
    }
}

int main() {
    Moblus();
    while(scanf("%d",&n)!=EOF) {
        ll ans=0;
        for(int i=0; i<tot; i++) {
            int x=n/prime[i];
            if(x==0)break;
            for(int j=1; j<=x; j++)
                ans+=(ll)mu[j]*(x/j)*(x/j);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: