51nod 1222 最小公倍数计数

本文介绍了一种解决特定区间内不同二元组数量问题的方法,该问题来源于ProjectEuler挑战赛。文章详细阐述了如何通过数学转换和优化算法来计算指定范围内最小公倍数为特定值的不同整数对的数量。

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

1222 最小公倍数计数
题目来源: Project Euler
基准时间限制:6 秒 空间限制:131072 KB 分值: 640 难度:8级算法题 收藏 关注
定义F(n)表示最小公倍数为n的二元组的数量。
即:如果存在两个数(二元组)X,Y(X <= Y),它们的最小公倍数为N,则F(n)的计数加1。
例如:F(6) = 5,因为[2,3] [1,6] [2,6] [3,6] [6,6]的最小公倍数等于6。

给出一个区间[a,b],求最小公倍数在这个区间的不同二元组的数量。
例如:a = 4,b = 6。符合条件的二元组包括:
[1,4] [2,4] [4,4] [1,5] [5,5] [2,3] [1,6] [2,6] [3,6] [6,6],共10组不同的组合。
Input
输入数据包括2个数:a, b,中间用空格分隔(1 <= a <= b <= 10^11)。
Output
输出最小公倍数在这个区间的不同二元组的数量。
Input示例
4 6
Output示例
10


【分析】

出题人丧心病狂…奇葩反演层出不穷
ans=ni=1nj=1[lcm(i,j)<=n]
=nd=1μ(d)ni=1nj=1nk=1[ijk<=n/d2]

大概过程就是把 lcm(i,j) 换成 ij/gcd(i,j),然后枚举gcd搞一搞。
f(x)=ni=1nj=1nk=1[ijk<=x]

观察到 d 最多枚举至n暴算一波f(x)出解。


【代码】

//51nod 1222 最小公倍数计数 
#include<bits/stdc++.h>
#define N 1000000
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=1000005;
ll n,m,l,r;
bool vis[mxn];
int pri[mxn],miu[mxn];
inline void init()
{
    miu[1]=1;
    for(int i=2;i<=N;i++)
    {
        if(!vis[i]) pri[++pri[0]]=i,miu[i]=-1;
        for(int j=1;j<=pri[0]&&(ll)i*pri[j]<=N;j++)
        {
            vis[i*pri[j]]=1;
            if(i%pri[j]==0) break;
            miu[i*pri[j]]=-miu[i];
        }
    }
}
inline ll solve(ll n)
{
    ll ans=0;
    for(ll k=1;k*k<=n;k++) if(miu[k])
    {
        ll x=n/(k*k),tmp=0;
        for(ll i=1;i*i*i<=x;i++)
        {
            tmp+=(x/(i*i)-i)*3+1;   //前两项(三项)相同的情况 
            for(ll j=i+1;i*j*j<=x;j++)
              tmp+=(x/(i*j)-j)*6+3;  //三项不同(后两项相同)的情况 
        }
        ans+=tmp*miu[k];
    }
    return (ans+n)>>1;
}
int main()
{
    init();
    int i,j;
    scanf("%lld%lld",&l,&r);
    printf("%lld\n",solve(r)-solve(l-1));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值