HDU - 4675 GCD of Sequence (莫比乌斯反演+组合数学)
题意:给出序列[a1..aN],整数M和k,求对1-M中的每个整数d,构建新的序列[b1...bN],使其满足:
1. \(1 \le bi \le M\)
2. \(gcd(b 1, b 2, …, b N) = d\)
3. 恰好有k个位置 \(bi!=ai\)
求对每个d,有多少种满足条件的序列
分析:对于前两个条件,就是单纯的莫比乌斯反演。
令\(F(d) = [d|gcd(b1...bN)]\)
\(f(d) = [gcd(b1...bN)]=d]\)
则$f(n) = \sum_{x|d}u(\frac{d}{x})F(d) \(
而该处又有限制恰好k个数与原序列不同,则考虑先从原序列是d的倍数的数中选出N-k个数,再在原序列不是d的倍数的位置上随意放置d的倍数,再将原序列中是d的倍数但在第一步中没有被选择的数放置与其不同的d的倍数。
所以\)F(d) =\dbinom{cnt(d)}{n-k} * (\frac{M}{d})^{n-cnt(d)} * (\frac{M}{d}-1)^{k-n+cnt(d)}$
需要预处理出莫比乌斯函数和阶乘逆
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod =1e9+7;
const int maxn=300000+5;
bool vis[maxn];
int prime[maxn],mu[maxn];
LL fac[maxn],inv[maxn];
LL qpow(LL a,LL n)
{
LL res=1;
while(n){
if(n&1) res = res*a%mod;
a = a*a%mod;
n>>=1;
}
return res;
}
void pre()
{
fac[0] = fac[1] = 1;
for(int i=2;i<maxn;++i) fac[i] = (fac[i-1]*i)%mod;
inv[maxn-1] = qpow(fac[maxn-1],mod-2);
for(int i=maxn-2;i>=0;--i) inv[i] = ( inv[i+1]*(i+1) )%mod;
}
LL Comb(LL n,LL k)
{
if(n<k) return 0;
else if(n==k) return 1;
else return ((fac[n]*inv[k]%mod)*inv[n-k])%mod;
}
void init_mu(int n){
int cnt=0;
mu[1]=1;
for(int i=2;i<n;i++){
if(!vis[i]){
prime[cnt++]=i;
mu[i]=-1;
}
for(int j=0;j<cnt&&i*prime[j]<n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0) {mu[i*prime[j]]=0;break;}
else { mu[i*prime[j]]=-mu[i];}
}
}
}
LL cnt[maxn];
LL F[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
init_mu(maxn);
pre();
int N,M,k,tmp;
while(scanf("%d %d %d",&N,&M,&k)==3){
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=N;++i){
scanf("%d",&tmp);
cnt[tmp]++;
}
for(int i=1;i<=M;++i){ //打表处理d的倍数的个数
for(int j=2*i;j<=M;j+=i){
cnt[i]+=cnt[j];
}
}
for(int d=1;d<=M;++d){
if(cnt[d]<N-k) {
F[d] = 0;
continue;
}
LL tmp = Comb(cnt[d],N-k) * qpow(M/d,N-cnt[d]) %mod;
F[d] = tmp * qpow(M/d-1,k-N+cnt[d]) %mod;
}
for(int t=1;t<=M;++t){
LL res=0;
for(int d = t;d<=M;d+=t){
res = (res+mu[d/t]*F[d]+mod)%mod;
}
if(t==M) printf("%lld\n",res);
else printf("%lld ",res);
}
}
return 0;
}
HDU - 4675 GCD of Sequence (莫比乌斯反演+组合数学)的更多相关文章
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- HDU 4675 GCD of Sequence (2013多校7 1010题 数学题)
GCD of Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解
题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...
- HDU 4675 GCD of Sequence(容斥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给出n,m,K,一个长度为n的数列A(1<=A[i]<=m).对于d(1< ...
- hdu 4675 GCD of Sequence
数学题! 从M到1计算,在计算i的时候,算出原序列是i的倍数的个数cnt: 也就是将cnt个数中的cnt-(n-k)个数变掉,n-cnt个数变为i的倍数. 且i的倍数为t=m/i; 则符合的数为:c[ ...
- 【CJOJ2512】gcd之和(莫比乌斯反演)
[CJOJ2512]gcd之和(莫比乌斯反演) 题面 给定\(n,m(n,m<=10^7)\) 求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\] 题解 首先把公因数直 ...
- hdu4675 GCD of Sequence 莫比乌斯+组合数学
/** 题目:hdu4675 GCD of Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给定n个数的a数组,以及m,k: ...
- [BZOJ4305]数列的GCD:莫比乌斯反演+组合数学
分析 一开始想的是对恰好\(k\)个位置容斥,结果发现对\(\gcd\)有些无从下手,想了想发现自己又sb了. 考虑对\(\gcd\)进行容斥处理,弱化条件,现在我们要求的是使\(\gcd\)是\(d ...
- HDU 2841 Visible Trees(莫比乌斯反演)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意:给n*m的矩阵(从(1,1)开始编号)格子,每个格子有一棵树,人站在(0,0)的位置,求可 ...
随机推荐
- Fiddler实现手机抓包——小白入门 - 做一个不动声色的大人
手机用fiddler抓包 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置 1. 配置fiddler允许监听到https(fiddle ...
- 一 Android Studio 打包Egret App
测试环境: Android Studio 2.3.2 Egret Engine 5.0.14 Egret Support5.0.12 官网教程:http://developer.egret.com/c ...
- 关东升的《从零开始学Swift》3月9日已经上架
大家一直期盼的<从零开始学Swift>于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发.全 ...
- Java操作文件转码
package downloadTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...
- Netty 应用程序的一个一般准则:尽可能的重用 EventLoop,以减少线程创建所带来的开销。
Netty 系列一(核心组件和实例). - JMCui - 博客园 https://www.cnblogs.com/jmcui/p/9154842.html 阅读目录 一.概念 二.核心组件 三.实例 ...
- jquery插件网址
各种分布图的插件:http://echarts.baidu.com/demo.html
- 如何获取Input标签自定义属性的值?
HTML代码: <input type="hidden" value="${Name?if_exists}" id='ID' busCode = &quo ...
- #define宏定义
1 #define的概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 该命令有两种格式:一种是简单的宏定义, ...
- 入木三分学网络第一篇--VRRP协议详解第一篇(转)
因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...
- 【我的Android进阶之旅】Android 7.0报异常:java.lang.SecurityException: COLUMN_LOCAL_FILENAME is deprecated;
之前开发的一个和第三方合作的apk,在之前公司的 Android 5.1 系统的手表上运行正常,今天在公司新开发的 Android 7.1系统的手表上运行的时候,使用 DownloadManager ...