设\(cnt[i]\)为权值为i的倍数的数的数量。

\(f0[i],f1[i]\)分别为两种方法\(gcd=i\)的贡献是i的多少倍。

\(F0[i],F1[i]\)分别为两种方法\(gcd\)为\(i\)的倍数的贡献是i的多少倍。

\(F0[i]=\sum_{j=1}^{cnt[i]}A_{cnt[i]}^{cnt[i]-j}*(n-j)!*(n-j+1)\)

\(F1[i]=\sum_{j=1}^{cnt[i]}j*C_{cnt[i]}^{j}\)

然后显然有\(F[i]=\sum_{d\mid i}f[d]\)

然后莫比乌斯反演一下

\[f(n)=∑_{n\mid d}μ(\frac{d}{n})F(d)
\]

复杂度调和级数\(O(nlnn)\)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const int N=101000;
const int p=258280327;
bool book[N];
int prime[N],mu[N],fac[N],inv[N],num;
int a[N],F0[N],f0[N],F1[N],f1[N],mx,cnt[N],T,n;
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
void init(){
for(int i=0;i<=100000;i++)
cnt[i]=a[i]=f1[i]=f0[i]=F1[i]=F0[i]=0;
}
int ksm(int x,int b){
int tmp=1;
while(b){
if(b&1)tmp=tmp*x%p;
x=x*x%p;
b>>=1;
}
return tmp;
}
int A(int n,int m){
return fac[n]*inv[n-m]%p;
}
int C(int n,int m){
return fac[n]*inv[n-m]%p*inv[m]%p;
}
void pre_work(){
mu[1]=1;
for(int i=2;i<=100000;i++){
if(book[i]==0){
prime[++num]=i;
mu[i]=-1;
}
for(int j=1;j<=num&&prime[j]*i<=100000;j++){
book[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[prime[j]*i]=-mu[i];
}
}
fac[0]=1;
for(int i=1;i<=100000;i++)fac[i]=(fac[i-1]*i)%p;
inv[100000]=ksm(fac[100000],p-2);
for(int i=99999;i>=0;i--)inv[i]=inv[i+1]*(i+1)%p;
}
signed main(){
pre_work();
while(scanf("%lld",&n)!=EOF){
init();
for(int i=1;i<=n;i++)a[read()]++;
for(int i=1;i<=100000;i++)
for(int j=i;j<=100000;j+=i)cnt[i]+=a[j];
for(int i=1;i<=100000;i++)
for(int j=1;j<=cnt[i];j++)
F0[i]=(F0[i]+A(cnt[i],j)*fac[n-j+1])%p,
F1[i]=(F1[i]+C(cnt[i],j)*j)%p;
for(int i=1;i<=100000;i++)
for(int j=i;j<=100000;j+=i)
f0[i]=(f0[i]+mu[j/i]*F0[j])%p,
f1[i]=(f1[i]+mu[j/i]*F1[j])%p;
int ans1=0,ans2=0;
for(int i=1;i<=100000;i++)
ans1=(ans1+f0[i]*i)%p,
ans2=(ans2+f1[i]*i)%p;
if(ans1>ans2)printf("Mr. Zstu %lld\n",ans1);
else if(ans1<ans2)printf("Mr. Hdu %lld\n",ans2);
else printf("Equal %lld\n",ans2);
}
return 0;
}

hdu5321 beautiful set(莫比乌斯反演)的更多相关文章

  1. HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)

    题意:给定一个 n 个数的集合,然后让你求两个值, 1.是将这个集合的数进行全排列后的每个区间的gcd之和. 2.是求这个集合的所有的子集的gcd乘以子集大小的和. 析:对于先求出len,len[i] ...

  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. Pyhton学习——Day40

    #一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:# 核心(ECMAScript)# 文档对象模型(DOM) Document object model (整合js,css,ht ...

  2. Win10内核驱动强制签名,申请沃通 EV代码签名证书

    2016年7月,微软在MSDN宣布从Windows 10的1607版本开始,强制要求所有新的Win10 内核驱动程序,必须获得Windows硬件开发者中心仪表盘门户的数字签名才能在系统中运行.这项政策 ...

  3. 一般树--common tree

    参照libyang中的lyd_tree的组织结构,写了一套通用树接口. github 的地址:https://github.com/HellsingAshen/mytc/tree/master/tc_ ...

  4. linux 模块编译步骤(原)

    linux 模块编译步骤(原) 博主推荐:<Linux命令模板Licote(原)> 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者 ...

  5. Matplotlib 绘图与可视化 一些属性和错误

    属性 *)调整图像边缘及图像间的空白间隔plt.subplots.adjust(6个参数) 图像外部边缘的调整可以使用plt.tight_layout()进行自动控制,此方法不能够很好的控制图像间的间 ...

  6. RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程

    一.Work Queues(using the Java Client) 走起   在第上一个教程中我们写程序从一个命名队列发送和接收消息.在这一次我们将创建一个工作队列,将用于分发耗时的任务在多个工 ...

  7. LaTeX 图片色偏解决方法

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50327113 在LaTeX的编辑模式中 ...

  8. Java二维码打印

    http://blog.csdn.net/OnePersonTZ/article/details/66560513

  9. hdu4927 Series 1(组合+公式 Java大数高精度运算)

    题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  10. 5种语言混合编程:C++、JS、python、Lisp、汇编

    /* 混合C++.JS.python.Lisp.汇编 1种语言,5种语法 */ main { //C++ vector<int> v; v.push(2); putsl(v.size()) ...