1 条题解

  • 0
    @ 2025-12-18 15:37:58
    #include<bits/stdc++.h>
    #define LL __int128
    using namespace std;
    const int N=1e7;
    int pr, p[N+10];LL mu[N+10]; bool v[N+10];
    void init()
    {
    	memset(v,0,sizeof(v));
    	pr=0;mu[0]=0;mu[1]=1;
        for(int i=2;i<=N;i++)
    	{
            if(!v[i]) p[++pr]=i, mu[i]=-1; 
            for(int j=1;j<=pr&&p[j]*i<=N;j++)
    		{
                v[i*p[j]]=true;
                if(i%p[j]==0){mu[i*p[j]]=0;break;}
                mu[i*p[j]]=-mu[i];
            }
        }
        for(int i=1;i<=N;i++) mu[i]+=mu[i-1];
    }
    LL calc2(int a,int b)
    {
        int n=min(a,b);
    	LL ans=0;
        for(int l=1,r;l<=n;l=r+1)
    	{
            r=min(a/(a/l), b/(b/l));
            ans+=(mu[r]-mu[l-1])*(a/l)*(b/l);
        }
        return ans;
    }
    LL calc3(int a,int b,int c)
    {
        int n=min({a,b,c});
    	LL ans=0;
        for(int l=1,r;l<=n;l=r+1)
    	{
            r=min({a/(a/l), b/(b/l),c/(c/l)});
            ans+=(mu[r]-mu[l-1])*(a/l)*(b/l)*(c/l);
        }
        return ans;
    }
    void qr(LL x)
    {
    	if(x>9)qr(x/10);
    	printf("%d",int(x%10));
    }
    int main()
    {
    	init();
    	int a,b,c;
    	while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    	{
    		if(a==1 && b==1 && c==1) {printf("0\n");continue;}
    		a--;b--;c--;
            qr(calc3(a,b,c)+calc2(a,b)+calc2(a,c)+calc2(b,c)+3);
            printf("\n");
    	}
        return 0;
    }
    
    • 1

    *【莫比乌斯反演】三维空间可见点数2[ZOJ3435]

    信息

    ID
    508
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    45
    已通过
    24
    上传者