BZOJ 3309 莫比乌斯反演
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3309
题意:定义f(n)为n所含质因子的最大幂指数,求 $Ans=\sum _{i=1}^{a}\sum_{j=i}^{b}f(gcd(i,j))$
T<=10000
1<=a,b<=10^7
解析:考虑a<b
枚举最大公约数d,得到:
$$Ans=\sum_{d=1}^a f(d)\sum_{i=1}^{\lfloor\frac{a}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{b}{d}\rfloor}[gcd(i,j)=1]$$
右边就是求$i\in[1,{\lfloor\frac{a}{d}\rfloor}],j\in[1,{\lfloor\frac{b}{d}\rfloor}]$ gcd(i,j)==1 的对数,根据莫比乌斯反演可以得到
$$Ans=\sum_{d=1}^a{f(d)}\sum_{d'=1}^{\lfloor\frac{a}{d}\rfloor}\mu(d'){\lfloor\frac{a}{dd'}\rfloor}{\lfloor\frac{b}{dd'}\rfloor}$$
令 T=dd'
$$Ans=\sum_{T=1}^{a}{\lfloor\frac{a}{T}\rfloor}{\lfloor\frac{b}{T}\rfloor}\sum_{d|T}\mu(\frac{T}{d}){f(d)}$$
左边可以分块求出来,所以右边要预处理出来前缀和,但是nlog(n) 的复杂度会超时,所以要大力分析一波
考虑 $G(n)=\sum_{d|n}\mu(\frac{n}{d}){f(d)}$ ,只有当 n/d是互不相等的素数乘积的形式 才会产生贡献,其余都是0 ,
设 n=p1^q1*p2^q2*p3^q3...pi^qi , k=max{qi}, f(d) 的取值只有两种 k 或 k-1
考虑 n/d 的组合情况 令,qi=k 的p集合为 A 剩余p集合为 B 当A集合全部都取时 f(d) = k-1 其余情况f(d) = k
1.当B不为空的时候 B集合的组合情况是奇数,偶数各占一半的。所以集合A 中的每一种情况与B组合 也是奇偶数量相同,相互抵消了,G(n)=0。
2.当B为空的时候,也就是所有的qi是相同的都等于k,因为只有当A集合全部都取时 f(d) = k-1 ,假设A集合的大小为m,一共有2^m个组合方案:
1)m为奇数时 $\mu(\frac{n}{d})$ 是 负的 ,f(d)= k 的组合方案数就是偶数多一个 G(n)=k-(k-1)=1
2) m为偶数时 $\mu(\frac{n}{d})$ 是 正的 ,f(d)= k 的组合方案数就是奇数多一个 G(n)=(k-1)-k=-1
总结一下就是:
当n的素因子个数为偶数且素因子的幂次都相等时 G(n)=-1,
当n的素因子个数为奇数且素因子的幂次都相等时 G(n)=-1,
其余G(n)=0。
对于幂次等于1的情况我们可以线性筛求出来G(i),G(i^k) =G(i) 指数级别的增长 O(n) 可以求出来所有的。
AC代码
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" ";
using namespace std;
const int maxn=1e7+,inf=0x3f3f3f3f;
typedef long long ll;
const ll mod = ;
typedef pair<int,int> pii;
int check[maxn],prime[maxn],G[maxn],sum[maxn];
void Mobius(int N)//线性筛求G(i)
{
int pos=;G[]=;
for (int i = ; i <= N ; i++)
{
if (!check[i])
prime[pos++] = i,G[i]=;
for (int j = ; j < pos && i*prime[j] <= N ; j++)
{
check[i*prime[j]] = ;
if (i % prime[j] == )
{
G[i*prime[j]]=;
break;
}
G[i*prime[j]]=-G[i];
}
}
}
int main()
{
Mobius(1e7);
sum[]=sum[]=;
for(int i=;i<=1e7;i++) //求G(i^k)
{
if(G[i]!=)
for(ll j=i;j<=1e7;j*=i)
sum[j]=G[i];
sum[i]+=sum[i-]; //前缀和
}
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
ll ans=;
for(int i=,j;i<=n;i=j+) // 分块sqrt复杂度求出答案
{
j=min(n/(n/i),m/(m/i));
ans+=1ll*(sum[j]-sum[i-])*(n/i)*(m/i);
}
printf("%lld\n",ans);
}
}
BZOJ 3309 莫比乌斯反演的更多相关文章
- 【题解】Crash的数字表格 BZOJ 2154 莫比乌斯反演
题目传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2154 人生中第一道自己做出来的莫比乌斯反演 人生中第一篇用LaTeX写数学公式的博客 大 ...
- BZOJ 2301 莫比乌斯反演入门
2301: [HAOI2011]Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函 ...
- bzoj 2154 莫比乌斯反演求lcm的和
题目大意: 表格中每一个位置(i,j)填的值是lcm(i,j) , 求n*m的表格值有多大 论文贾志鹏线性筛中过程讲的很好 最后的逆元我利用的是欧拉定理求解的 我这个最后线性扫了一遍,勉强过了,效率不 ...
- bzoj 2301 莫比乌斯反演
对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 这里题目意思很明显 对于要求的f[n] = sig ...
- bzoj 1101 莫比乌斯反演
最裸的莫比乌斯 #include<bits/stdc++.h> #define LL long long #define fi first #define se second #defin ...
- bzoj 2820 莫比乌斯反演
搞了一整个晚自习,只是看懂了dalao们的博客,目前感觉没有思路-.还是要多切题 next day: 刚才又推了一遍,发现顺过来了,hahaha #include<cstdio> #inc ...
- BZOJ - 2818 莫比乌斯反演 初步
要使用分块的技巧 #include<iostream> #include<algorithm> #include<cstdio> #include<cstri ...
- bzoj 2671 莫比乌斯反演
Calc Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 451 Solved: 234[Submit][Status][Discuss] Descr ...
- bzoj 2820 / SPOJ PGCD 莫比乌斯反演
那啥bzoj2818也是一样的,突然想起来好像拿来当周赛的练习题过,用欧拉函数写掉的. 求$(i,j)=prime$对数 \begin{eqnarray*}\sum_{i=1}^{n}\sum_{j= ...
随机推荐
- Ubuntu下搭建多用户多权限ftp
#1.切换root用户模式 (已在root模式下的请忽略) sudo -i #然后提示你输入当前用户密码,输入密码后回车后如果密码正确控制台就变成root@***:/# 了. #2.更新软件源 apt ...
- mysql替换表中某字段的某值
UPDATE `cases` SET `case_desc` = replace(`case_desc`, 'src="//tuku-assets.m.jia.com/assets/i ...
- matplotlib学习记录 七
# 绘制直方图 # 假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到 # 120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据? fro ...
- eclipse使用技巧的网站收集——转载(二)
写代码离不开文本编辑器,看代码也离不开,iar和keil编辑和阅读简直一般般了,因此使用eclipse可以看看代码,提高效率.网上有几个博客的文章,这里收集一下,以备忘. 以下文章转载自:http:/ ...
- PAT Basic 1081
1081 检查密码 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输 ...
- Linux之crond 服务介绍
在介绍crond之前,先科普一下什么是进程?什么是线程?什么是程序? 程序:程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节 ...
- Spring核心技术(十三)——环境的抽象
本章将描述一下Spring中针对环境的抽象. Environment是一个集成到容器之中的特殊抽象,它针对应用的环境建立了两个关键的概念:profile和properties. profile是命名好 ...
- Scala学习-02-方法
算数和操作符重载 所有的操作符都是方法. a + b 是一种缩写形式 : a .+ b “+”是方法名(操作符重载) ++和—— Scala中并没有“++”和“——”.需要使用“+=”和“-=” ...
- webdriver高级应用- 操作富文本框
富文本框的技术实现和普通的文本框的定位存在较大的区别,富文本框的常见技术用到了Frame标签,并且在Frame里面实现了一个完整的HTML网页结构,所以使用普通的定位模式将无法直接定位到富文本框对象. ...
- python+selenium面试题
selenium中如何判断元素是否存在? selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断. # 判断元素是否存在 try: dr.find_elem ...