题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675

题意:

  给定一个长度为n的序列a,且 1<=a[i]<=m,求分别有多少个序列b,使得GCD(b[1],b[2],...b[n])=x (1<=x<=m),且正好有k个b[i]!=a[i]。

分析:

  莫比乌斯反演,主要是确定F(x)。

  用F(x)表示gcd为x的倍数的方案数,f(x)表示gcd为x的方案数。

  先考虑F(d)怎么计算。可以把a数组中的数分成两类,第一类是必须对应下标不等的,即a[i]不是d的倍数),其他的就是第二类。

  假设第二类的数量是p,第一类的数量就是n−p,因为要选择k个不同的,第一类必须不同,所以需要在第二类中选择k−n+p个,而b数组中每一个数都有[m/p]种选择。

  所以最终的结果就是F(d)=C(p,k-n+p) ∗ ( ([m/d]−1)^(k−n+p) )∗( [m/d]^(n−p) ),然后暴力计算每一个f(d)就好了。总的复杂度是n(logn)。

代码:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std;
const int maxn=;
const long long mod=1e9+; int n,m,k;
int a[maxn];
int mu[maxn];
int vis[maxn];
int prime[maxn];
int cnt;
int num[maxn];
long long jie[maxn],ni[maxn];
long long F[maxn];
long long res[maxn]; void init()
{
memset(vis,,sizeof(vis));
mu[]=;
cnt=;
for(int i=;i<maxn;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
mu[i]=-;
}
for(int j=;j<cnt&&i*prime[j]<maxn;j++)
{
vis[i*prime[j]]=;
if(i%prime[j])
mu[i*prime[j]]=-mu[i];
else
{
mu[i*prime[j]]=;
break;
}
}
}
} long long power(long long a,long long n,long long m)
{
long long ans=,tmp=a%m;
while(n)
{
if(n&)
ans=ans*tmp%m;
tmp=tmp*tmp%m;
n=n/;
}
return ans;
} long long C(long long n,long long m)
{
if(n==)
return ;
return jie[n]*ni[m]%mod*ni[n-m]%mod;
} int main()
{
init();
ni[]=;
jie[]=;
for(int i=;i<maxn;i++)
{
jie[i]=jie[i-]*i%mod;
ni[i]=power(jie[i],mod-,mod);
}
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
memset(num,,sizeof(num));
for(int i=;i<=n;i++)
num[a[i]]++;
for(int i=;i<=m;i++)
{
long long p=;
for(int j=;j*i<=m;j++)
p+=num[i*j];
if(k-n+p<)
F[i]=;
else
F[i]=C(p,k-n+p)*power(m/i-,k-n+p,mod)%mod*power(m/i,n-p,mod)%mod;
}
for(int i=;i<=m;i++)
{
long long ans=;
for(int j=;i*j<=m;j++)
{
ans+=mu[j]*F[i*j];
ans=(ans%mod+mod)%mod;
}
if(i==)
printf("%lld",ans);
else
printf(" %lld",ans);
}
printf("\n");
}
return ;
}

hdu4675 GCD of Sequence的更多相关文章

  1. hdu4675 GCD of Sequence 莫比乌斯+组合数学

    /** 题目:hdu4675 GCD of Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给定n个数的a数组,以及m,k: ...

  2. ACM学习历程—HDU4675 GCD of Sequence(莫比乌斯)

    Description Alice is playing a game with Bob. Alice shows N integers a 1, a 2, …, a N, and M, K. She ...

  3. HDU-4675 GCD of Sequence 数学

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给一个大小为N的数列a[i],然后一个数M以及一个数K,要你求得一个数列b[i],其中b[ ...

  4. 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 ...

  5. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  6. 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< ...

  7. HDU - 4675 GCD of Sequence (莫比乌斯反演+组合数学)

    题意:给出序列[a1..aN],整数M和k,求对1-M中的每个整数d,构建新的序列[b1...bN],使其满足: 1. \(1 \le bi \le M\) 2. \(gcd(b 1, b 2, -, ...

  8. HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解

    题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...

  9. hdu 4675 GCD of Sequence

    数学题! 从M到1计算,在计算i的时候,算出原序列是i的倍数的个数cnt: 也就是将cnt个数中的cnt-(n-k)个数变掉,n-cnt个数变为i的倍数. 且i的倍数为t=m/i; 则符合的数为:c[ ...

随机推荐

  1. 【高斯消元】兼 【期望dp】例题

    [总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $           ...

  2. Struts2简诉

    Struts2框架是基于MVC模式的开源,MVC模式是一种开发方式,主要作用是对组件之间进行隔离,M代表业务逻辑层,V代表视图层,C代表控制层.有利于代码的后期维:Struts2框架的源码主要来于We ...

  3. ES6函数扩展

    前面的话 函数是所有编程语言的重要组成部分,在ES6出现前,JS的函数语法一直没有太大的变化,从而遗留了很多问题和的做法,导致实现一些基本的功能经常要编写很多代码.ES6大力度地更新了函数特性,在ES ...

  4. java泛型(整理)

    1 泛型基础知识 泛型需要理解两个关键点:1)类型擦除 2)类型转换 1)类型擦除 泛型有个很重要的概念,是类型擦除.正确理解泛型概念的首要前提是理解类型擦除(type erasure). Java中 ...

  5. jsp 之 解决 Mysql net start mysql启动,提示发生系统错误 5 拒绝访问的问题

    在dos下运行net start mysql时 !!!提示发生系统错误 5:拒绝访问!只要切换到管理员模式就可以启动了. 所以我们要以管理员身份来运行cmd程序来启动mysql. 1.在开始菜单的搜索 ...

  6. XRD 数据处理:使用 Origin 进行多谱图对比

    如果一个实验制备了 4 种不同条件下的样品,并分别测得了它们的 XRD 衍射谱图,那么在数据处理中如何用 Origin 软件得到一张多谱图对比的图呢? 样品间的谱图对比 如果只是谱图样品间对比(以 4 ...

  7. JS获取字符串长度(区分中英文)

    JS获取字符串长度(区分中英文) 中文算2个字,英文一个. function getStrLength(str) {      var cArr = str.match(/[^\x00-\xff]/i ...

  8. python实战第一天-paramiko模块并练习

    操作系统 Ubuntu 15.10 IDE & editor JetBrains PyCharm 5.0.2 ipython3 Python版本 python-3.4.3 安装paramiko ...

  9. css2--垂直对齐

    ## CSS2 vertical-align 垂直对齐     - baseline   默认值.基于基线对齐     - middle     位于同一行的非衬线字体小写字母的 1/2 处.不要为父 ...

  10. 中国大学MOOC-翁恺-C语言程序设计习题集-解答汇总

    中国大学MOOC-翁恺-C语言程序设计习题集 PAT 习题集 02-0. 整数四则运算(10) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standar ...