【bzoj4305】数列的GCD 组合数学+容斥原理
题目描述
输入
输出
样例输入
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 组合数学+容斥原理的更多相关文章
- [BZOJ4305]数列的GCD:莫比乌斯反演+组合数学
分析 一开始想的是对恰好\(k\)个位置容斥,结果发现对\(\gcd\)有些无从下手,想了想发现自己又sb了. 考虑对\(\gcd\)进行容斥处理,弱化条件,现在我们要求的是使\(\gcd\)是\(d ...
- 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)^ ...
- HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举)
HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举) 题意分析 求在[1,n-1]中,m个整数的倍数共有多少个 与 UVA.10325 ...
- UVA.10325 The Lottery (组合数学 容斥原理 二进制枚举)
UVA.10325 The Lottery (组合数学 容斥原理) 题意分析 首先给出一个数n,然后给出m个数字(m<=15),在[1-n]之间,依次删除给出m个数字的倍数,求最后在[1-n]之 ...
- BZOJ 4305: 数列的GCD( 数论 )
对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...
- BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理
BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...
- UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...
- 【BZOJ 4305】 4305: 数列的GCD (数论)
4305: 数列的GCD Description 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不 ...
- bzoj 4305 数列的GCD
LINK:数列的GCD 题意: 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], ...
随机推荐
- 思维水题 poj1852
题目链接:http://poj.org/problem?id=1852 题意:木板长为n, 蚂蚁数量为k, 后面k个数,依次代表蚂蚁的位置, 当蚂蚁到达边界的时候会立马掉下,当两个蚂蚁相 ...
- C# JSON和对象之间互相转换
1.首先是声明用户信息对象,DataContract修饰类,表示可以被解析成JSON,DataMember修饰属性,Order表示 解析的顺序,另外Lover是数组列表,表示女朋友个数 Address ...
- springboot入门之一:环境搭建
springboot简介 springboot做为微服务的开发集合框架,有着天然的好处,它不像springmvc那样笨重繁杂,springmvc众多的配置使得开发人员很厌烦,为解决众多的配置带来的烦扰 ...
- T-SQL语句基础
连接服务器 - 去哪个仓库找目标数据库 - 找仓库中的目标区域查找目标表 - 找货柜找数据(以行为基础单位) - 在货柜上找到目标的物品 基础T-Sql语句1.SQL语句的注释 2.创建数据库crea ...
- C#之#if #endif的简单用法
有时候我们看到别人的代码中有#if #endif,其实这是通过不同版本来选择运行哪段代码,和咱们的if,else是一样的.下面看下简单的用法 #if DEBUG txt_display.Text = ...
- Qt 利用XML文档,写一个程序集合 二
接上一篇文章https://www.cnblogs.com/DreamDog/p/9213915.html XML文档的读写 一个根节点,下面每一个子节点代表一个子程序,内容为子程序名字,图标路径,e ...
- Selenium2+python自动化-xpath定位语法
前言 在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语 ...
- Iterable/Iterator傻傻分不清
区别可迭代对象和迭代器 1.判断是否可以迭代 from collections import Iterabledef fid(times): n = 0 a , b = 0,1 while n < ...
- JMeter学习笔记(一) 工具的安装和基本介绍
因为网上的资料比较多,就不多描述了,在此引用了其他大神的文档,用于学习 这个文档中有比较详细的jmeter工具介绍: https://wenku.baidu.com/view/64f3a5f75901 ...
- Android 测试 之adb shell
一.发送键盘事件: 命令格式1:adb shell input keyevent "value" 其中value以及对应的key code如下表所列: KeyEvent Value ...