Bzoj2694/Bzoj4659:莫比乌斯反演

先上题面:

首先看到这数据范围显然是反演了,然而第三个限制条件十分不可做。于是我们暂且无视他,大不了补集转化算完再减是吧。

于是我们有:

这里我们定义:

于是这个东西我们可以nlogn筛的说。
也就是说,我们求出f的前缀和后,就可以O(sqrt(n)+sqrt(m))分块计算了。
然而需要减去的东西怎么办呢?
反演题最难的不是推公式,而是你推出了公式却不知道是否可做。
仔细观察以上两个式子,原式中的g(也就是上式中的t),不就是我们枚举的gcd吗?
题面要求两个数不同时含某个平方因数,也就是他们的gcd不同时含某个平方因数。
那不就是我们原式中的g(上式中的t)不含平方因数吗?
而一个数x含平方因数,会有什么性质呢?μ(x)=0!
所以我们先枚举t,判断其μ值非0,然后去枚举h/t,更新f(h)即可。
这题取模2^30,我们直接用int自然溢出就好了。
(为什么?因为这样加减乘显然是对的,然而除法,只有在计算sum的时候会除二,这样我们会损失一位的精度。而int的正数精度为取模2^31的,损失一位后正好够用,所以我们可以这样做。理论上取模2^31我们也可以用unsigned int做,然而取模2^32就必须long long了。以上内容纯属口胡,如果因此wa了别打我就是了QAQ……)

代码:
(一开始sieve里面开的数组没加static wa了一次,身败名裂)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lli long long int
#define debug cout
using namespace std;
const int maxn=4e6+1e2,lim=4e6;
const int mod = << ; int mu[maxn],f[maxn]; inline void sieve() {
static int prime[maxn],cnt;
static bool vis[maxn];
mu[] = ;
for(int i=;i<=lim;i++) {
if( !vis[i] ) prime[++cnt] = i , mu[i] = -;
for(int j=;j<=cnt&&(lli)i*prime[j]<=lim;j++) {
const int tar = i * prime[j];
vis[tar] = ;
if( ! ( i % prime[j] ) ) break;
mu[tar] = -mu[i];
}
}
for(int i=;i<=lim;i++) if( mu[i] ) {
for(int j=;(lli)i*j<=lim;j++) f[i*j] += j * mu[j];
}
for(int i=;i<=lim;i++) f[i] *= i , f[i] += f[i-];
}
inline int sum(int x) {
return x * ( x + ) >> ;
}
inline int calc(int n,int m) {
if( n > m ) swap(n,m);
int ret = ;
for(int l=,r;l<=n;l=r+) {
r = min( n / ( n / l ) , m / ( m / l ) );
ret += ( f[r] - f[l-] ) * sum(n/l) * sum(m/l);
}
return ret;
} int main() {
static int T,a,b;
static lli ans;
scanf("%d",&T) , sieve();
while(T--) {
scanf("%d%d",&a,&b) , ans = calc(a,b);
ans = ( ans % mod + mod ) % mod;
printf("%lld\n",ans);
}
return ;
}

Bzoj2694/Bzoj4659:莫比乌斯反演的更多相关文章

  1. 【bzoj2694】Lcm 莫比乌斯反演+线性筛

    题目描述 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m|\mu(gcd(i,j))|lcm(i,j)$,即$gcd(i,j)$不存在平方因子的$lcm(i,j)$之 ...

  2. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  3. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  4. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  5. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  6. 莫比乌斯函数筛法 & 莫比乌斯反演

    模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...

  7. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  8. POI2007_zap 莫比乌斯反演

    题意:http://hzwer.com/4205.html 同hdu1695 #include <iostream> #include <cstring> #include & ...

  9. hdu.5212.Code(莫比乌斯反演 && 埃氏筛)

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

随机推荐

  1. python爬虫 抓取一个网站的所有网址链接

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  2. Java中多个异常的捕获顺序(多个catch)

    import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...

  3. 求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

  4. 20155321 2016-2017-2 《Java程序设计》第五周学习总结

    20155321 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 异常处理 Java提供特有的语句进行处理 try { 需要被检测的代码; } cat ...

  5. Vue.js绑定内联样式

    1.对象语法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  6. 按esc键 关闭模态框

    <!-- help start --> <div class="modal fade" id="myModal" tabindex=" ...

  7. Anaconda+django写出第一个web app(八)

    今天来实现网站的登入和登出功能. 首先我们需要在urls.py中添加路径,注意此处的路径和在导航栏中设置的文字路径保持一致: from django.urls import path from . i ...

  8. vue需要注意的事宜

    1.Vue在进行点击事件的时候大部分是在标签上进行添加的,一般在标签上添加@click: 如果需要在组件上面进行点击事件的时候,直接写@click是木有变化的,需要在后面添加一个.native就如@c ...

  9. consul服务发现和配置共享的软件,

    Consul 是什么 consul是一个支持多数据中心分布式高可用服务发现和配置共享的服务软件,由HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2. ...

  10. python3之Splash

    Splash是一个javascript渲染服务.它是一个带有HTTP API的轻量级Web浏览器,使用Twisted和QT5在Python 3中实现.QT反应器用于使服务完全异步,允许通过QT主循环利 ...