题意:给出序列[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. MathType中空格个数怎么显示

    在使用Word文档的时候很时候用原软件自带的公式编辑器不是很好用,也不方法.MathType就是来解决这个问题的,但是一些用户在使用过程中发现不会看究竟输了多少空格,只能估摸大概.下面本MathTyp ...

  2. leetcode -- Maximal Rectangle TODO O(N)

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  3. JB开发之问题汇总 [jailbreak,越狱技术]

    1.升级到Mac 10.9.1,Xcode 升级到5出现的问题: 1)升级前要做的事情: ①升级/重新安装iOSOpenDev,在终端输入 xcode-select --switch (xcode_d ...

  4. Lua中 MinXmlHttpRequest如何发送post方式数据

    local xhr=cc.XMLHttpRequest:new() xhr.responseType=cc.XMLHTTPREQUEST_RESPONSE_JSON xhr:open(“POST”,& ...

  5. SaltStack配置管理-LAMP状态设计

    上一篇:SaltStack之Salt-ssh 配置文件模板 apache: pkg.installed: - name: httpd service.running: - name: httpd /e ...

  6. 用于把List<Object>转换成Map<String,Object>形式

    /** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName ...

  7. Xcode6 部署iphone4s出现的问题 No architectures to compile for

    手贱升级到了Xcode6.结果一打开来就爆了各种错误换个警告; 各种百度和谷歌,终于搞定了,然后插上4S,结果还是报错. 解决: 1.找到 Build Settings 2.点击 Architectu ...

  8. ubuntu重新设置登陆界面|切换gdm kdm lightdm

    方法: $ sudo dpkg-reconfigure gdm 然后会出一个让你进行选择的提示,根据需要切换即可

  9. MySQL exists 和 not exists 的用法

    有一个查询如下: 1 SELECT c.CustomerId, c.CompanyName   2 FROM Customers c   3 WHERE EXISTS(   4     SELECT  ...

  10. chrome 因js死循环卡住

    chrome因js死循环卡住的解决方法: top命令查看chrome的pid kill -9 pid 杀死整个chrome进程(所有网页都关闭)