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)^(cnt[i]-K)*(m/i)^(n-cnt[i])
那么ans[i]=f[i]-sigma(ans[j]) (j%i==0)
cnt和组合数都可以在nlogn内预处理
所以复杂度nlogn
详见代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 300005
#define P 1000000007 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return ret;
} int pow2(int x,int y){
int ret=1;
while (y){
if (y&1) ret=(ll)ret*x%P;
y=y>>1;
x=(ll)x*x%P;
}
return ret;
} int n,m,K;
int a[N];
int cc[N];
int cnt[N];
void precompute(){
memset(cnt,0,sizeof(cnt));
for (int i=1;i<=n;++i) ++cnt[a[i]];
for (int i=1;i<=m;++i)
for (int j=2;i*j<=m;++j) cnt[i]+=cnt[i*j];
cc[K]=1;
for (int i=K+1;i<=n;++i) cc[i]=(ll)cc[i-1]*pow2(i-K,P-2)%P*i%P;
} int ans[N]; int main(){
n=read();m=read();K=n-read();
for (int i=1;i<=n;++i) a[i]=read();
precompute();
for (int i=m;i;--i)if (cnt[i]>=K){
ans[i]=(ll)cc[cnt[i]]*pow2(m/i-1,cnt[i]-K)%P*pow2(m/i,n-cnt[i])%P;
for (int j=2;i*j<=m;++j) (ans[i]-=ans[i*j]-P)%=P;
}
else ans[i]=0;
for (int i=1;i<m;++i) printf("%d ",ans[i]);
printf("%d\n",ans[m]);
return 0;
}
bzoj4305: 数列的GCD的更多相关文章
- [BZOJ4305]数列的GCD:莫比乌斯反演+组合数学
分析 一开始想的是对恰好\(k\)个位置容斥,结果发现对\(\gcd\)有些无从下手,想了想发现自己又sb了. 考虑对\(\gcd\)进行容斥处理,弱化条件,现在我们要求的是使\(\gcd\)是\(d ...
- BZOJ 4305: 数列的GCD( 数论 )
对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...
- 【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], ...
- 【bzoj4305】数列的GCD 组合数学+容斥原理
题目描述 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], b[2], ..., ...
- hdu6363 bookshelf 容斥+数列+数论gcd定理(也可以Möbius)
#define _CRT_SECURE_NO_WARNINGS #include<cmath> #include<iostream> #include<stdio.h&g ...
- 2016 大连网赛---Different GCD Subarray Query(GCD离散+树状数组)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 Problem Description This is a simple probl ...
- CF798 C. Mike and gcd problem
/* CF798 C. Mike and gcd problem http://codeforces.com/contest/798/problem/C 数论 贪心 题意:如果一个数列的gcd值大于1 ...
- codeforces 798c Mike And Gcd Problem
题意: 给出一个数列,现在有一种操作,可以任何一个a[i],用a[i] – a[i+1]和a[i]+a[i+1]替代a[i]和a[i+1]. 问现在需要最少多少次操作,使得整个数列的gcd大于1. 思 ...
随机推荐
- android studio 中 .9.png的制作
折腾好久,最后在一个群里面咨询一个朋友才弄好的,用的是1.2.2版,感觉对.9的支持不太好, 1,用一张干净的png图片放在mipmap里面. 2,点击图片右键最后一项,create 9-patch ...
- 实现PD控制
尝试为场加入PD控制 在之前的模拟中,需要最小化一个能量函数H. 这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出 对于表面点,有 J^T * Σfs = 0 ...
- WPF DatePicker默认显示当前日期
WPF的日历选择控件默认为当前日期,共有两种方法,一种静态,一种动态. 静态的当然写在DatePicker控件的属性里了,动态的写在对应的cs文件里,具体请看下面. 1.方法一: my ...
- document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法
document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...
- java:快速文件分割及合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- JAVA_HOME环境变量失效的解决办法
晚上把oracle自带的weblogic给卸载了,然后打开eclipse,发现报错了:Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg' JA ...
- scrapy 保存到 sqlite3
scrapy 爬取到结果后,将结果保存到 sqlite3,有两种方式 item Pipeline Feed Exporter 方式一 使用 item Pipeline 有三个步骤 文件 pipelin ...
- myeclipse中发送邮件出现Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
出现这个问题的原因是jar包版本不统一,解决方法如下: 我在项目导入了jar包 与myeclipse自带jar冲突了 删除Java EE 5 Libraries/javaee.jar/mail里的包有 ...
- [BZOJ2876][NOI2012]骑行川藏(拉格朗日乘数法)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2876 分析:就是要求约束条件下函数的极值,于是拉格朗日乘数列方程,发现化简后的关于vi ...
- 如何设置div高度为100%
div高度通常都是固定值,直接将div高度设为100%是无效的,那么如何设置才能有效呢? 直接给div设置height:100%即可,无效的原因一定是父元素的高度为0,最常见的就是给body的直接元素 ...