题意:给出序列[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. jQuery实现瀑布流布局详解(PC和移动端)

    首先我们将如下样式的若干个单元写进body中,并将“box”向左浮动: <div class="box">  <img class="img" ...

  2. CSS顶级技巧大放送,div+css布局必知

    字体大小使用px 在一行内声明CSS 对比下面两个: h2 {font-size:18px; border:1px solid blue; color:#000; } h2 {    font-siz ...

  3. Ubuntu 编译安装搭配LNMP 环境

    这里用Nginx1.2.0+mysql5.6.33+php5.6.2搭配安装环境 ---------------------------------------------Nginx BEGIN--- ...

  4. Spring_day02--log4j介绍_Spring整合web项目演示

    log4j介绍 1 通过log4j可以看到程序运行过程中更详细的信息 (1)经常使用log4j查看日志 2 使用 (1)导入log4j的jar包 (2)复制log4j的配置文件,复制到src下面 3 ...

  5. vim 命令重新安装

    author : headsen chendate: 2018-05-11 09:50:23 [root@localhost ~]# which vim /usr/bin/vim [root@loca ...

  6. Zabbix添加web页面监控告警

    一,选择添加了web监控的主机 二,创建一个告警触发器 三,定义监控项 设置完毕假如网站down就会触发告警 怎么设置web监控以及触发告警action参考 Zabbix使用SMTP发送邮件报警并且制 ...

  7. nginx分发请求的2种方式:1、指明server_name;2、通过location过滤uri来分发请求;

    user nginx; worker_processes 8; # = cpu num; error_log /data/nginx/log/error/error.log warn; # warn, ...

  8. MetaClass

    它的作用主要是 指定由谁来创建类,默认是type #python3 class Foo(metaclass=MyType): pass #python2 class Foo(object): __me ...

  9. 如何在 windows 配置 libtorch c++ 前端库?

    如何在 windows 配置 libtorch c++ 前端库? 下载 pytorch 已经编译好的库: 此库不带 gpu,主要方便演示.支持 win7 win10 系统. 下载地址:https:// ...

  10. LInux中ThreadInfo中的preempt_count字段

    最近看各种上下文,发现和ThreadInfo中的preemption字段密切,于是便调查了下. 看下Linux源码中的注释: /* * We put the hardirq and softirq c ...