【题意】给定a和b,求满足a<=lcm(x,y)<=b && x<y的数对(x,y)个数。a,b<=10^11。

【算法】莫比乌斯反演+组合计数

【题解】★具体推导过程参考:51nod1222 最小公倍数计数

过程运用到的技巧:

1.将所有i和j的已知因子提取出来压缩上届。

2.将带有μ(k)的k提到最前面,从而后面变成单纯的三元组形式。

最终形式:

$$ans=\sum_{k=1}^{\sqrt n} \mu(k)  \sum_{d}    \sum_{i} \sum_{j} [i*j*d<=\frac{n}{k^2}]$$

问题转化为枚举(d,i,j)三元组满足其乘积<=n/k^2。

虽然题目要求组合(有序),但是有d的存在,所以先求排列(无序)。

但是三元组的排列不方便统计,所以求三元组的组合乘上排列系数

先算严格从小到大的,然后减去两个相同的和三个相同的。

最后+n后/2就变成组合。

听说复杂度O(n^(2/3))。

#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int maxn=;
int miu[maxn],prime[maxn],tot;
bool vis[maxn];
int solve(int x){
if(!x)return ;
int N=(int)sqrt(x)+,ans=;
for(int k=;k<=N;k++)if(miu[k]){
int n=x/(k*k);
for(int d=;d*d*d<=n;d++){
for(int i=d+;i*i*d<=n;i++)ans+=miu[k]*((n/(d*i)-i)*+);
ans+=miu[k]*((n/(d*d)-d)*+);
}
}
return (ans+x)/;
}
#undef int
int main(){
#define int long long
int A,B;
scanf("%lld%lld",&A,&B);
int N=(int)sqrt(B)+;
miu[]=;
for(int i=;i<=N;i++){
if(!vis[i]){miu[prime[++tot]=i]=-;}
for(int j=;j<=tot&&i*prime[j]<=N;j++){
vis[i*prime[j]]=;//
if(i%prime[j]==)break;
miu[i*prime[j]]=-miu[i];
}
}
printf("%lld\n",solve(B)-solve(A-));
return ;
}

【51nod】1222 最小公倍数计数 莫比乌斯反演+组合计数的更多相关文章

  1. 数学:莫比乌斯反演-GCD计数

    Luogu3455:莫比乌斯反演进行GCD计数 莫比乌斯反演就是用来解决这一类问题的,通常f函数是要求的那个,F函数是显然的 这样利用F的结果就可以推出来f的结果 在计算结果的时候整除分快儿一下就可以 ...

  2. 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]

    1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...

  3. UOJ #54 时空穿梭 —— 计数+莫比乌斯反演+多项式系数

    题目:http://uoj.ac/problem/54 10分还要用 Lucas 定理囧...因为模数太小了不能直接算... #include<cstdio> #include<cs ...

  4. 51nod 1222 最小公倍数计数【莫比乌斯反演】

    参考:https://www.cnblogs.com/SilverNebula/p/7045199.html 所是反演其实反演作用不大,又是一道做起来感觉诡异的题 转成前缀和相减的形式 \[ \sum ...

  5. [51Nod 1222] - 最小公倍数计数 (..怎么说 枚举题?)

    题面 求∑k=ab∑i=1k∑j=1i[lcm(i,j)==k]\large\sum_{k=a}^b\sum_{i=1}^k\sum_{j=1}^i[lcm(i,j)==k]k=a∑b​i=1∑k​j ...

  6. 51nod1222 最小公倍数计数 莫比乌斯反演 数学

    求$\sum_{i = 1}^{n} \sum_{j = 1}^{i} [lcm(i, j) \le n]$因为这样不好求,我们改成求$\sum_{i = 1}^{n} \sum_{j = 1}^{n ...

  7. BZOJ 3518 点组计数 ——莫比乌斯反演

    要求$ans=\sum_{i=1}^n \sum_{j=1}^m (n-i)(m-j)(gcd(i,j)-1)$ 可以看做枚举矩阵的大小,然后左下右上必须取的方案数. 这是斜率单增的情况 然后大力反演 ...

  8. BZOJ4517 Sdoi2016 排列计数 【DP+组合计数】*

    BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 ...

  9. luogu3911 最小公倍数之和(莫比乌斯反演)

    link 给定\(A_1,A_2,\dots,A_N\),求\(\sum_{i=1}^N\sum_{j=1}^Nlcm(A_i,A_j)\) \(1\le N\le 50000;1\le A_i\le ...

随机推荐

  1. ACM-ICPC 2018 沈阳赛区网络预赛

    Supreme Number 1000ms 131072K   A prime number (or a prime) is a natural number greater than 111 tha ...

  2. lilntcode-508-摆动排序

    508-摆动排序 给你一个没有排序的数组,请将原数组就地重新排列满足如下性质 nums[0] <= nums[1] >= nums[2] <= nums[3].... 注意事项 请就 ...

  3. iOS-UICollectionViewController协议及回调

    一.UICollectionViewDataSource 1.返回Section数量的方法 - (NSInteger)numberOfSectionsInCollectionView: (UIColl ...

  4. java——线性表接口实现

    线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...

  5. Post/Redirect/Get

    参考地址:https://www.cnblogs.com/TonyYPZhang/p/5424201.html 参考资料:Flask Web开发:基于Python的Web应用开发实战 Post/Red ...

  6. js function的方法名是一个变量 能被重复定义 当变量名一致时候 会使用最后一个function

  7. luogu 1344 追查坏牛奶(最小割)

    第一问求最小割. 第二问求割边最小的最小割. 我们直接求出第二问就可以求出第一问了. 对于求割边最小,如果我们可以把每条边都附加一个1的权值,那么求最小割是不是会优先选择1最少的边呢. 但是如果直接把 ...

  8. CSS布局-垂直居中问题

    在前端页面的布局方面,很多时候需要用到垂直居中,如果父集元素或子元素的高度是固定的那么垂直居中可以用line-height或者定位 top:50%:margin-top:- height/2 px:实 ...

  9. Command Network OpenJ_Bailian - 3436(最小有向生成树模板题)

    链接: http://poj.org/problem?id=3164 题目: Command Network Time Limit: 1000MS   Memory Limit: 131072K To ...

  10. Linux 查询命令

    which       查看可执行文件的位置 whereis    查看文件的位置 locate       配合数据库查看文件位置 find          实际搜寻硬盘查询文件名称 (find也 ...