[多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)
[多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学)
题面
青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献从小到大排成一排,以便于发放奖金。每只羊都会得到数值在 1~m 的奖金,并且第 i 只羊的奖金应为第 i+1只羊的约数(即满足 ai|ai+1)。现在包包大人想知道一共有多少种不同的发放奖金的方式(两种发放奖金的方式不同是指在两种发放奖金的方式中存在某只羊拿到的奖金不同)
分析
我们发现,序列中不同的数最多只有\(O(\log m)\)个,因为后面的数至少是前面的数*2.
那么我们可以dp求出长度为\(i\)的每个数互不相同的序列个数。设\(dp[i][j]\)表示长度为\(i\),结尾为\(j\)的本质不同序列个数 .那么可以用\(dp[i][j]\)去更新\(dp[i+1][j*k] (jk \leq n,k \in \mathbb{N},k \neq 1)\)
for(int i=1;i<log2m;i++){//a序列里本质不同的数只有O(logm)个,因此不用对n个数dp,
for(int j=1;j<=m;j++){
for(int k=2;j*k<=m;k++){
dp[i+1][j*k]+=dp[i][j];
dp[i+1][j*k]%=mod;
}
}
}
因为1~m的数的约数个数和为\(O(m \log m)\),所以dp的复杂度是\(O(m \log ^2m)\)
然后考虑把序列扩展到长度为n。对于长度为\(i\)的每个数互不相同的序列,我们记它的方案数为\(cnt[i]=\sum_{j=1}^m dp[i][j]\).我们把长度为n的序列分成\(i\)段,每段对应长度为\(i\)数列中的一个值。用插板法,从\(n-1\)个间隔中选\(i-1\)个插板,方案数是\(C_{n-1}^{i-1}\)
因此答案是\(\sum_{i=1}^{\log_2m} C_{n-1}^{i-1}cnt[i]\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define maxlogm 23
#define maxn 1000000
#define maxm 1000000
#define mod 1000000007
using namespace std;
typedef long long ll;
ll fact[maxn+5],invfact[maxn+5];
inline ll fast_pow(ll x,ll k){
ll ans=1;
while(k){
if(k&1) ans=ans*x%mod;
x=x*x%mod;
k>>=1;
}
return ans;
}
ll inv(ll x){
return fast_pow(x,mod-2);
}
void ini(int n){
fact[0]=1;
for(int i=1;i<=n;i++) fact[i]=fact[i-1]*i%mod;
invfact[n]=inv(fact[n]);
for(int i=n-1;i>=0;i--) invfact[i]=invfact[i+1]*(i+1)%mod;
}
inline ll C(int n,int m){
return fact[n]*invfact[n-m]%mod*invfact[m]%mod;
}
int n,m;
int log2m;
ll dp[maxlogm+5][maxm+5];//长度为i,结尾为j的本质不同序列个数
ll cnt[maxlogm+5];//长度为i的序列个数, 即sum(dp[i][j]) (1<=j<=m)
int main(){
scanf("%d %d",&m,&n);
log2m=log2(m)+1;
ini(max(n,log2m));
for(int i=1;i<=m;i++) dp[1][i]=1;
for(int i=1;i<log2m;i++){//a序列里本质不同的数只有O(logm)个,因此不用对n个数dp,
for(int j=1;j<=m;j++){
for(int k=2;j*k<=m;k++){
dp[i+1][j*k]+=dp[i][j];
dp[i+1][j*k]%=mod;
}
}
}
for(int i=1;i<=log2m;i++){//a序列里本质不同的数只有O(logm)个,因此不用对n个数dp,
for(int j=1;j<=m;j++){
cnt[i]+=dp[i][j];
cnt[i]%=mod;
}
}
ll ans=0;
for(int i=1;i<=log2m&&i<=n;i++){
ans+=cnt[i]*C(n-1,i-1)%mod;//把n个数分成i段,每段对应序列中的一个数,插板法
ans%=mod;
}
printf("%lld\n",ans);
}
[多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)的更多相关文章
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
- [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)
[多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...
- [多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)
[51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...
- [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)
[51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...
- 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...
- [2019多校联考(Round 6 T3)]脱单计划 (费用流)
[2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...
- 【BZOJ5498】[十二省联考2019]皮配(动态规划)
[BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...
- 三校联考 Day3
三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...
- [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...
随机推荐
- 【NOIP2012模拟11.1】塔(加强)
题目 玩完骰子游戏之后,你已经不满足于骰子游戏了,你要玩更高级的游戏. 今天你瞄准了下述的好玩的游戏: 首先是主角:塔.你有N座塔一列排开.每座塔各自有高度,有可能相等. 这个游戏就不需要地图了. 你 ...
- 【mysql】全文索引match多列报错
表结构如下: CREATE TABLE `T` ( .... FULLTEXT KEY `title_fc` (`titleindex`), FULLTEXT KEY `shortname_fc` ( ...
- Error: pgraster_wkb_reader: grayscale band type 10 unsupported
错误原因:Float32 is not supported for rendering.即栅格数据类型Float32不支持. cmd中用GDAL查看.在波段中的数据类型是Float32的不支持渲染. ...
- 16.合并两个排序的链表(python)
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class Solution: # 返回合并后列表 def Merge(self, pHead1 ...
- DataGrip连接阿里云的MySQL
参考:https://www.cnblogs.com/i6010/articles/7723503.html 第一步:在/etc/mysql/my.cnf下找到bind-address = 127.0 ...
- react样式
https://www.jianshu.com/p/711c596571d6(copy)
- [luogu]P2657低头一族[树状数组]
[luogu]P2657 低头一族 题目描述 一群青年人排成一队,用手机互相聊天. 每个人的手机有一个信号接收指标,第i个人的接收指标设为v[i]. 如果位置在x[i]的人要和位置在xj的人聊天,那么 ...
- sh_11_九九乘法表
sh_11_九九乘法表 # 1. 打印 9 行小星星 row = 1 while row <= 9: col = 1 while col <= row: # print("*&q ...
- 基于数组阻塞队列 ArrayBlockingQueue 的一个队列工具类
java语言基于ArrayBlockingQueue 开发的一个根据特定前缀和后缀的队列.每天自动循环生成. 1.定义队列基类 Cookie package com.bytter.util.queue ...
- maven 配置私服 连接
两种方法: 1.在单个项目的pom.xml中使用 私服的连接地址,这样只对该项目起作用. 2.在maven的setting.xml配置中添加私服的连接地址.这样对所有项目起作用. 本文章只演示第二种方 ...