hdu5321 beautiful set(莫比乌斯反演)
设\(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]\)
然后莫比乌斯反演一下
\]
复杂度调和级数\(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(莫比乌斯反演)的更多相关文章
- HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)
题意:给定一个 n 个数的集合,然后让你求两个值, 1.是将这个集合的数进行全排列后的每个区间的gcd之和. 2.是求这个集合的所有的子集的gcd乘以子集大小的和. 析:对于先求出len,len[i] ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2924 Solved: 1091[Submit][Status][ ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...
- 莫比乌斯函数筛法 & 莫比乌斯反演
模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...
- 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2371 Solved: 1143[Submit][Sta ...
- POI2007_zap 莫比乌斯反演
题意:http://hzwer.com/4205.html 同hdu1695 #include <iostream> #include <cstring> #include & ...
- hdu.5212.Code(莫比乌斯反演 && 埃氏筛)
Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
随机推荐
- Unity 三维软件单位导入资源单位比例
三维软件 内部米制尺寸/m 默认设置导入unity中的尺寸/m 与unity单位比例 Maya 1 100 1:100 3DS MAX 1 0.01 100:1 Cinema 4D 1 100 1:1 ...
- Linux入门学习
什么是Linux? Linux是一个操作系统软件.和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统,它是一个支持多用户.多任务.多线程和多CPU的操作系统 ...
- Pyhton学习——Day46
# 数据库:存储数据的仓库# 数据库更多的是安全.备份# 客户端取服务端的数据实际都是从服务端的内存中抓取数据# 数据库管理系统软件# 数据库管理系统(Database Management Syst ...
- easyUI在使用字符串拼接时样式不起作用,点击加号增加一行,点击减号删除一行效果。
拼接的按钮没有样式,需要使用 var str = $("<a href='javascript:void(0)' class='easyui-linkbutton' onclick=' ...
- 页面元素的定位:getBoundingClientRect()和document.documentElement.scrollTop
1.document.documentElement.getBoundingClientRect MSDN对此的解释是: Syntax oRect = object.getBoundingClient ...
- C# Windows Api的一些方法 封装 以及 常用参数
using System;using System.Collections.Generic;using System.Drawing;using System.Diagnostics;using Sy ...
- [转载] Linux新手必看:浅谈如何学习linux
本文转自 https://www.cnblogs.com/evilqliang/p/6247496.html 本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习 ...
- Linux系统串口接收数据编
http://blog.csdn.net/bg2bkk/article/details/8668576 之前基于IBM deveplopworks社区的代码,做了串口初始化和发送的程序,今天在此基础上 ...
- LeetCode 11. Container With Most Water 单调队列
题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...
- snprintf
snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...). 将可变参数 “…” 按照format的 ...