题意:给出序列[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 (莫比乌斯反演+组合数学)的更多相关文章

  1. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  2. 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 ...

  3. HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解

    题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...

  4. 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< ...

  5. hdu 4675 GCD of Sequence

    数学题! 从M到1计算,在计算i的时候,算出原序列是i的倍数的个数cnt: 也就是将cnt个数中的cnt-(n-k)个数变掉,n-cnt个数变为i的倍数. 且i的倍数为t=m/i; 则符合的数为:c[ ...

  6. 【CJOJ2512】gcd之和(莫比乌斯反演)

    [CJOJ2512]gcd之和(莫比乌斯反演) 题面 给定\(n,m(n,m<=10^7)\) 求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\] 题解 首先把公因数直 ...

  7. hdu4675 GCD of Sequence 莫比乌斯+组合数学

    /** 题目:hdu4675 GCD of Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给定n个数的a数组,以及m,k: ...

  8. [BZOJ4305]数列的GCD:莫比乌斯反演+组合数学

    分析 一开始想的是对恰好\(k\)个位置容斥,结果发现对\(\gcd\)有些无从下手,想了想发现自己又sb了. 考虑对\(\gcd\)进行容斥处理,弱化条件,现在我们要求的是使\(\gcd\)是\(d ...

  9. HDU 2841 Visible Trees(莫比乌斯反演)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意:给n*m的矩阵(从(1,1)开始编号)格子,每个格子有一棵树,人站在(0,0)的位置,求可 ...

随机推荐

  1. python入门(七):CGI编程

    CGI CGI(Common Gateway Interface),通用网关接口,HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI在其中扮演的是在we ...

  2. iOS开发之--一些有用的博文和博客

    应用内购的详细教程: http://mp.weixin.qq.com/s?__biz=MzA3NzM0NzkxMQ==&mid=2655357883&idx=2&sn=7cda ...

  3. Android无线测试之—UiAutomator UiScrollable API介绍五

    滑动区域校准常量设置与获取 一.校准概念 校准常量指的是:滑动操作坐标时的偏移量,用来取偏移比例 二.相关API 返回值 API 描述 double getSwipeDeadZonePercentag ...

  4. mybatis 控制台打印出来的sql 执行结果为空 但是将sql放到mysql执行有数据

    mybatis中的sql如下 select airln_Cd airlnCd,city_coordinate_j cityCoordinateJ,city_coordinate_w cityCoord ...

  5. 如何在 Linux 上录制你的终端操作

    导读 录制一个终端操作可能是一个帮助他人学习 Linux .展示一系列正确命令行操作的和分享知识的通俗易懂方法.不管是出于什么目的,从终端复制粘贴文本需要重复很多次,而录制视频的过程也是相当麻烦,有时 ...

  6. java基础---->hashSet的简单分析(一)

    对于HashSet而言,它是基于HashMap实现的,底层采用HashMap来保存元素的.今天我们就简单的分析一下它的实现.人生,总会有不期而遇的温暖,和生生不息的希望. HashSet的简单分析 一 ...

  7. 牛客网_Wannafly模拟赛1

    A.矩阵 题目链接:https://www.nowcoder.com/acm/contest/submit/f8363c912a4c48a28b80f47e7102b6b8?ACMContestId= ...

  8. xcode6 下载

    百度云下载 http://pan.baidu.com/s/1qWpuIC0提取码:ip9o 苹果下载: http://adcdownload.apple.com//wwdc_2014/xcode_6_ ...

  9. Android sharedPreferences 用法

    Android 提供了一种数据轻量级的数据持久化方法.使用SharedPreferences 接口 将 key-value 形式的primitive data 存储到文件中.多用于保存软件偏好配置信息 ...

  10. http 服务器编程 适配器

    小结: 1.HandleFunc 只是一个适配器 go http 服务器编程(1) - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1 ...