莫比乌斯函数 && HDU-1695
莫比乌斯函数定义:
$$\mu(d)=\begin{cases}
1 &\text{d = 1}\\
(-1)^r &\text{$d=p_1p_2...p_r,其中p_i为不同的素数$}\\
0 &\text{else}
\end{cases}$$
性质:
(1)$\sum_{d|n}\mu(d)=[n=1]$
(2)$\sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n}$
莫比乌斯反演(没写定义域之类的):
$F(n)=\sum_{d|n}f(d)或F(n)=\sum_{d|n}f(\frac{n}{d}){\quad}{\Leftrightarrow}{\quad}f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})或f(n)=\sum_{d|n}\mu(\frac{n}{d})F(d)$
$F(n)=\sum_{n|d}f(d){\quad}{\Leftrightarrow}{\quad}f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)$(一般用的都是这种)
并不清楚为什么d没有上限
证明:https://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html
(性质1根据二项式定理直接证,那么反演公式可以根据性质1证(第二种反演的证法类似第一种反演,式子可以做类似的变换))
线性筛莫比乌斯函数
设mu[i]为i的莫比乌斯函数值
首先,mu[1]=1
mu[一个质数]=-1
对于一个合数x,设其最小质因子为p,那么它会被q=x/p筛掉,在它被q筛掉时,判断一下q%p是否为0,如果为0则说明q有至少1个质因子p,因此x有至少2个质因子p,那么mu[x]=0;否则mu[x]=-mu[q]
模板题:给定i,j,k,求$\sum_{i=1}^n{\sum_{j=1}^m{[(i,j)=k]}}$
设$f(x)=\sum_{i=1}^n{\sum_{j=1}^m{[(i,j)=x]}}$
设$F(x)=\sum_{x|d}{\sum_{i=1}^n{\sum_{j=1}^m{[(i,j)=d]}}}=\sum_{i=1}^n{\sum_{j=1}^m{[x|(i,j)]}}$
显然$F(x)={\lfloor}{\frac{n}{x}}{\rfloor}*{\lfloor}{\frac{m}{x}}{\rfloor}$
那么可以根据F(x)计算f(x)得到答案
(从中看出一类通用的关系:"满足f(a)是x的倍数/因数的a个数""满足f(a)等于x的a的个数"间的转换)
https://vjudge.net/problem/HDU-1695
(此题跟以上"模板题"题面类似,但不完全一样,要加一些特判)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define N 100100
ll prime[N+],len,mu[N+];
bool nprime[N+];
ll a,c,n,m,k,ans,a2;
ll F(ll x) {return (m/x)*(n/x);}
ll F2(ll x) {return (n/x)*(n/x);}
int main()
{
ll i,j,T,TT;
mu[]=;
for(i=;i<=N;i++)
{
if(!nprime[i]) prime[++len]=i,mu[i]=-;
for(j=;j<=len&&i*prime[j]<=N;j++)
{
nprime[i*prime[j]]=;
if(i%prime[j]==) {mu[i*prime[j]]=;break;}
else mu[i*prime[j]]=-mu[i];
}
}
scanf("%lld",&T);
for(TT=;TT<=T;TT++)
{
scanf("%lld%lld%lld%lld%lld",&a,&n,&c,&m,&k);
if(n>m) swap(n,m);
ans=a2=;
if(k>n||k==) goto xxx;
for(i=;i<=n/k;i++)
ans+=mu[i]*F(i*k);
for(i=;i<=n/k;i++)
a2+=mu[i]*F2(i*k);
ans-=(a2-)/;
xxx:;
printf("Case %lld: %lld\n",TT,ans);
}
return ;
}
另外:此题也可以不用莫比乌斯函数做,可以直接容斥
简单来讲就是先算出数组F,其中F[i]=F(i)
然后预处理出n个vector(d1,d2,..,dn),第i个表示i的所有因子(用枚举每个数的倍数的方式,而不是枚举因子)
然后从大到小枚举i,对于i除自身外所有的因子j,F[j]-=F[i]
对此题并没有什么特别的好处。。只是记一下有这种方法
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define N 100100
ll an[N+];
ll a,c,n,m,k,ans,a2;
ll F(ll x) {return (m/x)*(n/x);}
ll F2(ll x) {return (n/x)*(n/x);}
vector<ll> d[];
int main()
{
ll i,j,T,TT;
for(i=;i<=;i++)
for(j=*i;j<=;j+=i)
d[j].pb(i);
scanf("%lld",&T);
for(TT=;TT<=T;TT++)
{
scanf("%lld%lld%lld%lld%lld",&a,&n,&c,&m,&k);
if(n>m) swap(n,m);
ans=a2=;
if(k>n||k==) goto xxx;
for(i=;i<=n;i++) an[i]=F(i);
for(i=n;i>=;i--)
for(j=;j<d[i].size();j++)
an[d[i][j]]-=an[i];
ans+=an[k];
for(i=;i<=n;i++) an[i]=F2(i);
for(i=n;i>=;i--)
for(j=;j<d[i].size();j++)
an[d[i][j]]-=an[i];
a2+=an[k];
ans-=(a2-)/;
xxx:;
printf("Case %lld: %lld\n",TT,ans);
}
return ;
}
资料待看:
https://www.cnblogs.com/chenyang920/p/4811995.html
https://blog.csdn.net/danliwoo/article/details/51866867
莫比乌斯函数 && HDU-1695的更多相关文章
- hdu 1695 GCD 【莫比乌斯函数】
题目大意:给你 a , b , c , d , k 五个值 (题目说明了 你可以认为 a=c=1) x 属于 [1,b] ,y属于[1,d] 让你求有多少对这样的 (x,y)满足gcd(x,y)= ...
- hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion
http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不 ...
- HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法
题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...
- D - GCD HDU - 1695 -模板-莫比乌斯容斥
D - GCD HDU - 1695 思路: 都 除以 k 后转化为 1-b/k 1-d/k中找互质的对数,但是需要去重一下 (x,y) (y,x) 这种情况. 这种情况出现 x ,y ...
- 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)
题目链接 Problem Description RXD is a good mathematician. One day he wants to calculate: ∑i=1nkμ2(i)×⌊nk ...
- GCD HDU - 1695 莫比乌斯反演入门
题目链接:https://cn.vjudge.net/problem/HDU-1695#author=541607120101 感觉讲的很好的一个博客:https://www.cnblogs.com/ ...
- HDU 6053 TrickGCD (莫比乌斯函数)
题意:给一个序列A,要求构造序列B,使得 Bi <= Ai, gcd(Bi) > 1, 1 <= i <= n, 输出构造的方法数. 析:首先这个题直接暴力是不可能解决的,可以 ...
- hdu 1965 (莫比乌斯函数 莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 容斥
又是求gcd=k的题,稍微有点不同的是,(i,j)有偏序关系,直接分块好像会出现问题,还好数据规模很小,直接暴力求就行了. /** @Date : 2017-09-15 18:21:35 * @Fil ...
- BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3028 Solved: 1460[Submit][Sta ...
随机推荐
- stm32GPIO8种模式
stm32GPIO工作模式及用途 1.浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1 2.带上拉输入GPIO_IPU——IO内部上拉电阻输入 ...
- 20170225-第一件事:SAP模块清单
第一件事:SAP模块清单 AM 资产会计 资产会计BC SAP Netweaver SAP NetweaverBW 业务信息仓库 业务信息仓库CA 常规跨应用程序 常规跨越应用程序CO 控制 控制 C ...
- C# 软件实现远程桌面调用
1.https://www.codeproject.com/Articles/19836/Palantir-Remote-Desktop-Manager codeproject项目 2.http:// ...
- Introduce Null Object
今天继续总结<重构>这本书中的一个重构手法,Introduce Null Object.写这个手法是因为它确实很巧妙,在实际编程中经常会遇到这种情况,前人总结出来了这么一个经典的手法,当然 ...
- td 中设置超出宽度显示省略号失效
td测试内容超出显示省略号时,结果没有显示省略号,而是一直往后显示,且超出了td大小,强行挤大了table. 原因是因为td默认不换行. 解决方法: 1.强制td换行. IE加上word-break: ...
- Hive两种访问方式:HiveServer2 和 Hive Client
老版HiveClient: 要求比较多,需要Hive和Hadoop的jar包,各配置环境. HiveServer2: 使得与YARN和HDFS的连接从Client中独立出来, ...
- (C)字节对齐#pragma pack()
1. 为什么要进行对齐 对于结构体,编译器会自动进行成员变量对齐处理,是为了提高运算效率. 缺省情况下是自然对齐方式. 2. 自然对齐 即默认对齐,按照结构体的成员中size最大的成员进行对齐. 例: ...
- Scrapy爬虫报错:ModuleNotFoundError: No module named 'win32api'
运行 scrapy crawl douban_spider 出现报错: 解决办法:安装pywin32,下载适配安装的Python版本(64位,Python3.6) 下载地址: https://sour ...
- html5--6-13 CSS3中的颜色表示方式
html5--6-13 CSS3中的颜色表示方式 学习要点 掌握选择器的优先级问题 掌握CSS3中新增的颜色表示方式 选择器的优先级问题 原则上:元素选择器<类选择器< ID选择器< ...
- html5--6-52 动画效果-过渡
html5--6-52 动画效果-过渡 实例 @charset="UTF-8"; div{ width: 300px; height: 150px; margin: 30px; f ...