bzoj2671: Calc

本文探讨了一种基于数论的问题解决方法,通过枚举和筛选技术来计算特定数学表达式的解。利用莫比乌斯函数优化计算过程,适用于处理与最大公约数(GCD)相关的复杂问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设k=gcd(a,b),a=x*k,b=y*k。
x*k+y*k=(x+y)*k整除x*y*k*k。
因为gcd(x,y)=1,gcd(x+y,x)=gcd(x+y,y)=1,所以x+y整除k。
 Ans=n1y=1y1x=1[gcd(x,y)=1]ny(x+y)
对于 ny(x+y) 的值进行枚举。
被sqrt卡了。。。

#include<iostream> 
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 100000
using namespace std;
int n,mu[N],k[N],ss[N],b[N],l,h,t;
ll Ans;
int main()
{
    scanf("%d",&n);
    mu[1]=1;
    for (int i=2;i<=50000;i++)
    {
        if (ss[i]==0) mu[i]=-1,b[++l]=i;
        for (int j=1;j<=l;j++)
        {
            int t=i*b[j];
            if (t>50000) break;
            ss[t]=1;
            if (i%b[j]==0){mu[t]=0;break;}
            mu[t]=-mu[i];
        }
    }
    for (int i=2;i<=n/(i+1);i++)
    {
        l=0;int j;
        for (j=1;j*j<i;j++)
            if (i%j==0) k[++l]=j,k[++l]=i/j;
        if (j*j==i) k[++l]=j;
        sort(k+1,k+l+1);
        for (h=1;h<i&&i<=n/(h+i);h=t+1)
        {
            t=min(n/(n/i/(h+i))/i-i,i-1);
            ll sum=0;
            for (int j=1;k[j]<=t;j++)
                sum+=mu[k[j]]*(t/k[j]-(h-1)/k[j]);
            Ans+=n/i/(h+i)*sum;
        }
    }
    printf("%lld\n",Ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值