[多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)

时间:2022-01-04 01:32:58

[多校联考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+组合数学)的更多相关文章

  1. &lbrack;多校联考2019&lpar;Round 5 T1&rpar;&rsqb; &lbrack;ATCoder3912&rsqb;Xor Tree&lpar;状压dp&rpar;

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  2. &lbrack;多校联考2019&lpar;Round 5 T2&rpar;&rsqb;蓝精灵的请求&lpar;二分图染色&plus;背包&rpar;

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  3. &lbrack;多校联考2019&lpar;Round 4 T1&rpar;&rsqb;&lbrack;51nod 1295&rsqb;Xor key&lpar;可持久化trie&rpar;

    [51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...

  4. &lbrack;多校联考2019&lpar;Round 4 T2&rpar;&rsqb;&lbrack;51nod 1288&rsqb;汽油补给&lpar;ST表&plus;单调栈&rpar;

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  5. 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7

    此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...

  6. &lbrack;2019多校联考&lpar;Round 6 T3&rpar;&rsqb;脱单计划 &lpar;费用流&rpar;

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  7. 【BZOJ5498】&lbrack;十二省联考2019&rsqb;皮配(动态规划)

    [BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...

  8. 三校联考 Day3

    三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...

  9. &lbrack;十二省联考2019&rsqb;字符串问题——后缀自动机&plus;parent树优化建图&plus;拓扑序DP&plus;倍增

    题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...

随机推荐

  1. Android APK反编译就这么简单 详解(附图)

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  2. 谈谈Java利用原始HttpURLConnection发送POST数据

    这篇文章主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧 URLConnectio ...

  3. Window中常见的dos命令

    1.如何实行操作dos命令:如果是Windows电脑,从开始--->所有程序---->附件--->命令提示 这样就可以开始命令提示符了 2关于一些dos命令: 2.1 盘符切换:盘符 ...

  4. oracle 11g 64w 用32位的pl&sol;sql

    1.  下载64位Oracle,解压两文件,解压完成后将文件合并,安装: 2.  下载PL/SQL,安装: 3.  下载instantclient-basic-win32-11.2.0.1.0.zip ...

  5. Light oj 1234 - Harmonic Number

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1234 给你一个数n,让你求 这个要是直接算的话肯定TLE,要是用1e8的数组预处理存储 ...

  6. Quartus14&period;1中Qsys创建custom component时编译出错原因

    利用Quartus14.1中Qsys工具新建自定义组件时会产生“part-select direction is opposite from prefix index direction”错误,这是由 ...

  7. Android 创建Library Project&lpar;库项目&rpar;与引用操作

    由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软 ...

  8. Oracle jdbc 连接

    所需jar包: ojdbc6.jar 下载地址:https://download.csdn.net/download/xc_oo0/10897959 示例代码: package cnblogs.com ...

  9. where 常用条件范例

    where() public method Sets the WHERE part of the query. The method requires a $condition parameter, ...

  10. python易混易乱&lpar;2&rpar;

    字符串切割成列表: 以str为分隔符切片mystr,如果maxsplit有指定值,则仅分割maxsplit个字符串,得到maxsplit个字符串的列表 利用字符串的split() 方法 >&gt ...