题目描述

给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N)。 
现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], b[2], ..., b[N],满足: 
(1)1<=b[i]<=M(1<=i<=N); 
(2)gcd(b[1], b[2], ..., b[N])=d; 
(3)恰好有K个位置i使得a[i]≠b[i](1<=i<=N) 
注:gcd(x1,x2,...,xn)为x1, x2, ..., xn的最大公约数。 
输出答案对1,000,000,007取模的值。 

输入

第一行包含3个整数,N,M,K。 
第二行包含N个整数:a[1], a[2], ..., a[N]。 

输出

输出M个整数到一行,第i个整数为当d=i时满足条件的不同数列{b[n]}的数目mod 1,000,000,007的值。 

样例输入

3 3 3
3 3 3

样例输出

7 1 0


题解

数学+容斥

老套路了,先处理出 $\gcd$ 为 $d$ 的倍数的方案数:

预处理出 $\{a[n]\}$ 中 $d$ 的倍数的数目 $c[d]$ ,那么 $d$ 的倍数中需要有 $n-k$ 个与 $\{a[n]\}$ 相同,有 $C_{c[d]}^{n-k}$ 种方案。

其余 $c[d]-n+k$ 个 $d$ 的倍数每个都有 $\lfloor\frac md\rfloor-1$ 种方案,因为 $d$ 的倍数总共有 $\lfloor\frac md\rfloor$ 个,减去不能等于原序列的1个。

剩下 $n-c[d]$ 个非 $d$ 的倍数的每个有 $\lfloor\frac md\rfloor$ 种方案。

因此 $\gcd$ 为 $d$ 的倍数的方案数就是 $C_{c[d]}^{n-k}\times(\lfloor\frac md\rfloor -1)^{c[d]-n+k}\times(\lfloor\frac md\rfloor)^{n-c[d]}$ 。

然后这个答案需要容斥一下,减去 $d$ 的2以上倍数的答案。

即 $ans[d]=C_{c[d]}^{n-k}\times(\lfloor\frac md\rfloor -1)^{c[d]-n+k}\times(\lfloor\frac md\rfloor)^{n-c[d]}-\sum\limits_{i=2}^{\lfloor\frac md\rfloor}ans[i\times d]$ 。

从大到小循环 $d$ ,后面的 $ans$ 已经求出,直接减掉即可,不需要莫比乌斯反演。

由于数的范围只有 $m=300000$ ,因此每一步都可以调和级数预处理。

时间复杂度 $O(n\log n)$

#include <cstdio>
#define N 300010
#define mod 1000000007
typedef long long ll;
int a[N] , v[N] , c[N];
ll fac[N] , ans[N];
inline ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
int main()
{
int n , m , k , i , j;
scanf("%d%d%d" , &n , &m , &k) , k = n - k;
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i]) , v[a[i]] ++ ;
for(i = 1 ; i <= m ; i ++ )
for(j = 1 ; i * j <= m ; j ++ )
c[i] += v[i * j];
fac[0] = 1;
for(i = 1 ; i <= n ; i ++ ) fac[i] = fac[i - 1] * i % mod;
for(i = m ; i ; i -- )
{
if(c[i] >= k) ans[i] = fac[c[i]] * pow(fac[k] , mod - 2) % mod * pow(fac[c[i] - k] , mod - 2) % mod * pow(m / i - 1 , c[i] - k) % mod * pow(m / i , n - c[i]) % mod;
for(j = 2 ; i * j <= m ; j ++ ) ans[i] = (ans[i] - ans[i * j] + mod) % mod;
}
for(i = 1 ; i < m ; i ++ ) printf("%lld " , ans[i]);
printf("%lld\n" , ans[m]);
return 0;
}

【bzoj4305】数列的GCD 组合数学+容斥原理的更多相关文章

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

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

  2. bzoj4305: 数列的GCD

    要求k个与原序列中的数不同,就是要求(n-k)个相同,令K=n-k 然后cnt[i]表示序列a中i的倍数的个数 f[i]表示gcd为i的倍数的方案数 f[i]=C(cnt[i],K)*(m/i-1)^ ...

  3. HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举)

    HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举) 题意分析 求在[1,n-1]中,m个整数的倍数共有多少个 与 UVA.10325 ...

  4. UVA.10325 The Lottery (组合数学 容斥原理 二进制枚举)

    UVA.10325 The Lottery (组合数学 容斥原理) 题意分析 首先给出一个数n,然后给出m个数字(m<=15),在[1-n]之间,依次删除给出m个数字的倍数,求最后在[1-n]之 ...

  5. BZOJ 4305: 数列的GCD( 数论 )

    对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...

  6. BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理

    BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程     X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...

  7. UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)

    UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...

  8. 【BZOJ 4305】 4305: 数列的GCD (数论)

    4305: 数列的GCD Description 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N).  现在问题是,对于1到M的每个整数d,有多少个不 ...

  9. bzoj 4305 数列的GCD

    LINK:数列的GCD 题意: 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], ...

随机推荐

  1. 20155338 2006-2007-2 《Java程序设计》第2周学习总结

    20155338 2006-2007-2 <Java程序设计>第2周学习总结 教材学习内容总结 本周学习了教材的第三章内容,大体上都较好理解,有很多内容基本上都跟C语言的知识类似,学习的内 ...

  2. vector的二维用法+前缀和

    题目链接:https://codeforces.com/contest/1082/problem/C(C. Multi-Subject Competition) A multi-subject com ...

  3. jenkins自动打包部署linux

    需要用到2个插件. git parameter:用于参数化构建时选择分支. Publish Over SSH:用于上传jar包和操作tomcat 1.先在系统设置添加要连接的linux服务器,使用用户 ...

  4. https双向认证网站搭建

    新建网站 在搭建网站证书之前,我们先搭建好我们的网站 1.网站基本搭建 为我们的项目新建一个网站,按照如下的步骤来 1,打开IIS,右键单击网站弹出菜单,选择网站(如图1.1.1) 图1.1.1 2, ...

  5. 学习笔记之glog的使用

    下载源码,使用cmake编译,最后得到了32位的静态库 glog.lib 使用库时要注意添加以下预定义: GLOG_NO_ABBREVIATED_SEVERITIES; GOOGLE_GLOG_DLL ...

  6. 7个Node.js的Web框架

    NodeJS也就是Node,是众所周知的使用javascript构建Web应用框架,它启动一个服务器非常简单,如下: var http = require('http'); http.createSe ...

  7. MySQL Proxy和 Amoeba 工作机制浅析

    MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...

  8. 详解Python中的下划线

    本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用 ...

  9. java 不同数据类型的相互转化

    在工作中经常会遇到需要将数据类型转化的情况,今天抽出时间总结一下. date——string Date date = new Date(); DateFormat dateformat = new S ...

  10. “Hello World!”团队第五周第五次会议

    博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout&push代码 一.会议时间 2017年11月14日  ...