ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[ccBB]Billboards

2021-09-03 07:01:19  阅读:87  来源: 互联网

标签:frac int Billboards ccBB ans 物品 ll mod


参考loj2265中关于杨表的相关知识

先来考虑$m\mid n$的情况:

记$t=\frac{n}{m}$,将序列划分为$[1,m],[m+1,2m],...,[(t-1)m+1,tm]$这$t$段,每一段都至少有$k$个物品且可以同时取到,因此取到最小值时必然都恰为$k$个

构造一个$t$列且每列有$k$个格子的杨表,其中第$i$列记录第$t-i+1$段中的$k$个物品相对于该段左端点的距离,不难发现此时合法即要求其为半标准杨表,也即求$g_{m,\{t,t,...,t\}}$(共$k$个$t$)

根据性质3.3,即有$g_{m,\{t,t,...,t\}}=\prod_{i=1}^{k}\prod_{j=1}^{t}\frac{m+j-i}{(k-i)+(t-j)+1}$

先枚举$i$,并分别考虑后者的分子和分母,不难发现即$\frac{(m-i+t)!(k-i)!}{(m-i)!(k-i+t)!}$

将上下同时约掉一个$t!$,即可预处理阶乘及逆元并$o(m\log P)$计算该式

再来考虑$m\not\mid n$的情况:

令$t=\lfloor\frac{n}{m}\rfloor,p=n\ mod\ m$,对其分类讨论:

1.若$p\le m-k$,即需要保证$t$段中每一段的前$p$个位置不能放物品(否则不难得到最后这$p$个位置也要放物品,答案不足够小),也即将$m$减去$p$并令$n=tm$后的问题

2.若$p>m-k$,即需要保证$t$段中每一段的最后$m-p$个位置必须放物品(否则不难得到最后这$p$个位置要放多于$p-(m-k)$个物品,答案也不足够小)

将最后这$p$个位置补至$m$个,由于补充的位置必须填,因此不影响方案数

换言之,即将$k$减去$m-p$、$m$变为$p$并令$n=(t+1)m$后的问题

最终,时间复杂度即为$o(m \log P)$,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mod 1000000007
 4 #define ll long long
 5 int t,n,m,k,ans;
 6 int qpow(int n,int m){
 7     int s=n,ans=1;
 8     while (m){
 9         if (m&1)ans=(ll)ans*s%mod;
10         s=(ll)s*s%mod;
11         m>>=1;
12     }
13     return ans;
14 }
15 int main(){
16     scanf("%d",&t);
17     while (t--){
18         scanf("%d%d%d",&n,&m,&k);
19         if (n%m){
20             int t=n/m,p=n%m;
21             if (p<=m-k)m-=p,n=t*m;
22             else k-=m-p,m=p,n=(t+1)*m;
23         }
24         ans=1;
25         int t=n/m;
26         for(int i=1;i<=k;i++){
27             int s=1;
28             for(int j=t+1;j<=m-i+t;j++)s=(ll)s*j%mod;
29             for(int j=1;j<=k-i;j++)s=(ll)s*j%mod;
30             for(int j=1;j<=m-i;j++)s=(ll)s*qpow(j,mod-2)%mod;
31             for(int j=t+1;j<=k-i+t;j++)s=(ll)s*qpow(j,mod-2)%mod;
32             ans=(ll)ans*s%mod;
33         }
34         printf("%d\n",ans);
35     }
36 }  
View Code

 

标签:frac,int,Billboards,ccBB,ans,物品,ll,mod
来源: https://www.cnblogs.com/PYWBKTDA/p/15221523.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有