权限题...

题目描述:


Description

给出一个长度为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取模的值。 

Input

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

Output

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

Sample Input

3 3 3
3 3 3

Sample Output

7 1 0

Hint

当d=1,{b[n]}可以为:(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1)。 
当d=2,{b[n]}可以为:(2, 2, 2)。 
当d=3,因为{b[n]}必须要有k个数与{a[n]}不同,所以{b[n]}不能为(3, 3, 3),满足条件的一个都没有。 
对于100%的数据,1<=N,M<=300000, 1<=K<=N, 1<=a[i]<=M。 

考虑当 d 为公倍数,但不一定为最小公倍数时的方案:

因为有 k 个数要不同

设 s = n-k ,表示有 s 个数要与原数列相同

当 d 为公倍数时,设 a 数列中有 sum 个数为 d 的倍数

因为对于与原数列相同的那 s 个数,它们必须都为 d 的倍数

所有一定要从 sum 个 d 的倍数的数中取出 s 个数

从 sum 个 d 的倍数的数中取出 s 个数的方案数为 C(s,cum) (C(n,m)表示从m个数中取出n个数的方案数)

然后考虑与原数列不相同的数,显然每一个数只要取 d 的倍数就好了

那么每个数取的方案有 [m/d] 种 ([a/b] 表示 a/b 向下取整),(可以取每一个 ≤ m 的 d 的倍数)

但是要注意,对于那些原来就是 d 的倍数,但没被选的数,它们不能取原来的值

所以对于这些数,它们的取数方案只有 [m/d]-1 种 (不能取自己原来的值)

所以总方案数 ans [ d ] = C(s,sum) * ([m/d]-1)^(sum-s)  *  ([m/d])^(n-sum)

原数列相同的那 s 个数的方案数 * 对于那些原来就是 d 的倍数但没被选的数的方案数 * 原本不是d的倍数的数的方案数

然后再考虑当 d 为最小公倍数时的情况:

设 Ans[ i ] 表示 i 为最小公倍数时的方案

那么 Ans [ d ] = ans[ d ] - Ans[ d*i ]  (2<= i && d*i <= m)

这个用反向的递推可以全部求出来

关于 C 的计算可以先预处理一波阶乘

那么 C(n,m) = m!/( n! * (m-n)! )

但是因为要取模质数 = 1e9+7

可以用费马小定理求出 x 模P意义下的逆元 = x^(P-2) (P是质数)

然后就可以搞了,注意开long long

复杂度大概为 O(nlogP)

具体看代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=5e5+7,mo=1e9+7;
int n,m,k;
ll f[N],ans[N];//f是阶乘,ans是答案
int cnt[N];//cnt[i]表示值为i的数的个数
inline ll ksm(ll x,ll y)//快速幂
{ll res=1;while(y){if(y&1) res=(res*x)%mo;x=x*x%mo; y>>=1;}return res;
}
inline ll C(ll n,ll m){ return f[m]*ksm(f[n],mo-2)%mo*ksm(f[m-n],mo-2)%mo; }//求C(n,m)
int main()
{int a;cin>>n>>m>>k;for(int i=1;i<=n;i++) scanf("%d",&a),cnt[a]++;f[0]=1;//注意f[0]=1for(int i=1;i<=n;i++) f[i]=f[i-1]*i%mo;int s=n-k;for(int i=m;i;i--)//从后往前算
    {int sum=0;for(int j=i;j<=m;j+=i) sum+=cnt[j];//计算sumif(sum<s){ ans[i]=0; continue; }//如果原数列还没有s个数为d的倍数,那么方案不存在ans[i]=C(s,sum)*ksm(m/i-1,sum-s)%mo*ksm(m/i,n-sum)%mo;//先算出d为公倍数但不一定是最小公倍数时的情况//然后再减去不是最小公倍数的情况for(int j=i*2;j<=m;j+=i) ans[i]=(ans[i]+mo-ans[j])%mo;//这时后面的ans都是处理好的
    }for(int i=1;i<=m;i++) printf("%lld ",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/9706377.html

BZOJ4305 数列的GCD相关推荐

  1. 2019.5.summary

    2019.5.1 CF C. Prefix Sum Primes 感觉CF就是训练妳如何养成对题目强大的YY能力的QAQ 我们构造 如果只有一种,没辙,只能这样放 否则先放一个2,再放一个1 接下来把 ...

  2. 2016 大连网赛---Different GCD Subarray Query(GCD离散+树状数组)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 Problem Description This is a simple probl ...

  3. 浅析欧几里德算法 GCD和LCM

    前言 欧几里德算法作为有着非常简短的实现的算法,可能很多初学者(包括当时的我)都不求甚解.本文给出了GCD.LCM的性质,以及欧几里德算法的实现.证明和时间复杂度推导. 这里是我的个人网站: http ...

  4. 洛谷 P1306 斐波那契公约数

    题意简述 求斐波那契数列第n项和第m项的最大公约数 题解思路 设斐波那契数列第x项为F[x] 则有结论\(Gcd(F[n], F[m]) = F[Gcd(n, m)]\) ============== ...

  5. T83310 【音乐会】二重变革

    T83310 [音乐会]二重变革 题解 你看数据那么大,又是一道数学题 题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己 观察代码当中有一行 也就是说明最后这个数列都将变成同一个 ...

  6. D. Unusual Sequences (数论,质因子分解,dp)

    D. Unusual Sequences time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. 题解报告(CDUT暑期集训——第六场)

    题解报告(CDUT暑期集训--第六场) A - oval-and-rectangle HDU - 6362 思路:水题 积分一化就出来了 AC代码 #include<stdio.h> #i ...

  8. python计算e∧x近似值、最后一项绝对值小于10-6_编程用泰勒公式求e的近似值,直到最后一项小于10的负6次方为止。...

    00 alv抬头等 *&---------------------------------------------------------------------* *& Report ...

  9. luogu P4108 [HEOI2015]公约数数列(分块、gcd性质)

    题解链接 #include <cstdio> #include <algorithm> #include <cstring> #include <vector ...

  10. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

最新文章

  1. Linux Terminal 控制终端的使用
  2. 跟小博老师一起学Servlet ——Servlet之HttpServletResponse
  3. H5开发中的问题总结
  4. GeneralUpdate实现应用程序更新
  5. Linux禁止非WHEEL用户使用SU命令
  6. 如何做好一场技术演讲?
  7. fastjson jsonobject 转bean失败_干掉quot;FastJsonquot;?
  8. excel导出_学习笔记—— 前端导出excel
  9. Windows系统历史版本简介
  10. 联想智能农业移动应用开发系统用户手册
  11. php流水系统,php流水账txt数据库版
  12. 拖延2年的Bug,Linux 上的三星 SSD 驱动错误终于得到修复
  13. 移植emwin到stm32f205上卡死在gui_init();
  14. 电子科学与技术毕业论文题目【452个】
  15. HTML:Marked-js+Bootstarp简单实现Markdown文本编辑器
  16. 华为自研OS操作系统,今秋是否真的会面市?
  17. GeoGebra官方版下载
  18. android app 适应不同大小屏幕_Android自适应屏幕大小和布局
  19. python求解组合数_6-2 jmu-python-组合数据类型-1.计算坐标点欧氏距离 (10分)
  20. c++直角空心三角形_2019秋人教版八年级数学上册三角形教材全解读

热门文章

  1. think php 500错误,thinkPHP5配置nginx环境无法打开 ,每次都是报500错误
  2. 送你一份价值5800元的技术干货PPT | 技术管理者工作坊强势来袭!
  3. SQL各个关键字的顺序
  4. (转)MySQL慢查询分析优化 + MySQL调优
  5. 斐波那契数列【java实现】
  6. linux+ tomcat 遇到ClientAbortException: java.net.SocketException: Broken pipe
  7. ES6的类Class基础知识点
  8. js代码错误监控代码
  9. Chart.js报告
  10. C#小方法PadLeft 和 PadRight