BZOJ4305 数列的GCD
权限题...
题目描述:
Description
Input
Output
Sample Input
3 3 3
3 3 3
Sample Output
7 1 0
Hint
考虑当 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相关推荐
- 2019.5.summary
2019.5.1 CF C. Prefix Sum Primes 感觉CF就是训练妳如何养成对题目强大的YY能力的QAQ 我们构造 如果只有一种,没辙,只能这样放 否则先放一个2,再放一个1 接下来把 ...
- 2016 大连网赛---Different GCD Subarray Query(GCD离散+树状数组)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 Problem Description This is a simple probl ...
- 浅析欧几里德算法 GCD和LCM
前言 欧几里德算法作为有着非常简短的实现的算法,可能很多初学者(包括当时的我)都不求甚解.本文给出了GCD.LCM的性质,以及欧几里德算法的实现.证明和时间复杂度推导. 这里是我的个人网站: http ...
- 洛谷 P1306 斐波那契公约数
题意简述 求斐波那契数列第n项和第m项的最大公约数 题解思路 设斐波那契数列第x项为F[x] 则有结论\(Gcd(F[n], F[m]) = F[Gcd(n, m)]\) ============== ...
- T83310 【音乐会】二重变革
T83310 [音乐会]二重变革 题解 你看数据那么大,又是一道数学题 题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己 观察代码当中有一行 也就是说明最后这个数列都将变成同一个 ...
- D. Unusual Sequences (数论,质因子分解,dp)
D. Unusual Sequences time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 题解报告(CDUT暑期集训——第六场)
题解报告(CDUT暑期集训--第六场) A - oval-and-rectangle HDU - 6362 思路:水题 积分一化就出来了 AC代码 #include<stdio.h> #i ...
- python计算e∧x近似值、最后一项绝对值小于10-6_编程用泰勒公式求e的近似值,直到最后一项小于10的负6次方为止。...
00 alv抬头等 *&---------------------------------------------------------------------* *& Report ...
- luogu P4108 [HEOI2015]公约数数列(分块、gcd性质)
题解链接 #include <cstdio> #include <algorithm> #include <cstring> #include <vector ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
最新文章
- Linux Terminal 控制终端的使用
- 跟小博老师一起学Servlet ——Servlet之HttpServletResponse
- H5开发中的问题总结
- GeneralUpdate实现应用程序更新
- Linux禁止非WHEEL用户使用SU命令
- 如何做好一场技术演讲?
- fastjson jsonobject 转bean失败_干掉quot;FastJsonquot;?
- excel导出_学习笔记—— 前端导出excel
- Windows系统历史版本简介
- 联想智能农业移动应用开发系统用户手册
- php流水系统,php流水账txt数据库版
- 拖延2年的Bug,Linux 上的三星 SSD 驱动错误终于得到修复
- 移植emwin到stm32f205上卡死在gui_init();
- 电子科学与技术毕业论文题目【452个】
- HTML:Marked-js+Bootstarp简单实现Markdown文本编辑器
- 华为自研OS操作系统,今秋是否真的会面市?
- GeoGebra官方版下载
- android app 适应不同大小屏幕_Android自适应屏幕大小和布局
- python求解组合数_6-2 jmu-python-组合数据类型-1.计算坐标点欧氏距离 (10分)
- c++直角空心三角形_2019秋人教版八年级数学上册三角形教材全解读
热门文章
- think php 500错误,thinkPHP5配置nginx环境无法打开 ,每次都是报500错误
- 送你一份价值5800元的技术干货PPT | 技术管理者工作坊强势来袭!
- SQL各个关键字的顺序
- (转)MySQL慢查询分析优化 + MySQL调优
- 斐波那契数列【java实现】
- linux+ tomcat 遇到ClientAbortException: java.net.SocketException: Broken pipe
- ES6的类Class基础知识点
- js代码错误监控代码
- Chart.js报告
- C#小方法PadLeft 和 PadRight