Codeforces 232B Table

蒟蒻模拟赛上场切的一道蓝,非常难以置信我竟然能做蓝题。

这题的数据范围初看还是比较坑的,\(10^{18}\) 的值域很容易让人往矩阵加速那方面想。实际上在列出转移方程式后,我们发现状态是二维的,无法使用矩阵加速(或者说这样做很麻烦)。

思路

首先观察到每个边长为 \(n\) 的正方形的包含的点都一样,可以画出如下图:

可以观察到:左边矩形与右边矩形重合的部分为中间灰色部分,它包含的点数记为 \(b\) ,左边黄绿色部分包含的点数记为 \(a\) ,右边黄绿色部分包含的点数记为 \(c\) 。

那么由题目条件可知:

\[a+b=b+c
\]

因此可得:

\[a=c
\]

所以我们可以发现,正方形每往后移动一位,移动前的第一列和移动后的最后一列的点数是一样的。

而本题求的是方案数,对于有 \(x\) 个点的一列,其方案数为 \(C_{n}^{x}\) 。并且又由于移动前的第一列和移动后的最后一列的点数一样,所以他们的方案数也一样。

如果我们把正方形每次的移动看做把第一列移动到最后一列接上,那么我们可以发现,正方形各列的点数形成了循环节。

于是对于正方形的每一列,我们把它看做一个类型,第 \(i\) 列的类型在整张棋盘中的出现次数则为 \(\left \lfloor \frac{m}{n} \right \rfloor\) ,如果 $ (m \bmod n) \ge i$ ,那么出现次数还会再加 \(1\) 。

接下来的问题就是求把 \(k\) 个点分给 \(n\) 个列,求出整个问题的总方案数了。

这是个很显然的分组背包,我们把每一列看做一个组,假设这一列在棋盘中出现了 \(y\) 次,按照放的点数 \(x\) 将列看做物品,其体积即为 \(x\) ,其贡献的方案数即为 \((C_{n}^{x})^y\) 。

正确时间复杂度为 \(O(n^2k)\) 。

注意优化常数,如果在转移过程中再计算快速幂和组合数那么会导致复杂度变成 \(O(n^2k\log n)\) ,于是我们需要预处理出这部分,才能保证复杂度正确。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,m,k,ans=0,f[50005],g[50005],dp[50005],p[105][2];
ll qp(ll x,ll y)
{
ll res=1;
while(y)
{
if(y&1)res=res*x%mod;
y>>=1;
x=x*x%mod;
}
return res%mod;
}
ll niyuan(ll x)
{
return qp(x,mod-2);
}
void init()
{
f[0]=1;
g[0]=1;
for(int i=1;i<=10000;i++)
{
f[i]=f[i-1]*i%mod;
g[i]=g[i-1]*niyuan(i)%mod;
}
}
ll c(ll m,ll n)
{
return 1ll*f[m]*g[m-n]%mod*g[n]%mod;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
cin>>n>>m>>k;
dp[0]=1;
for(ll i=0;i<=n;i++)
{
p[i][0]=qp(c(n,i),m/n);
p[i][1]=qp(c(n,i),m/n+1);
}
for(int i=1;i<=n;i++)
{
for(int j=k;j>=0;j--)
{
int lmt=min(1ll*j,n);
for(int l=1;l<=lmt;l++)
{
ll tmp;
if((m%n)>=i)tmp=p[l][1];
else tmp=p[l][0];
dp[j]=(dp[j]+dp[j-l]*tmp%mod)%mod;
}
}
}
cout<<dp[k];
return 0;
}

Codeforces 232 B Table 题解 [ 蓝 ] [ 分组背包 ] [ 组合数学 ] [ 循环节 ]的更多相关文章

  1. Codeforces Round #383 (Div. 2) D 分组背包

    给出一群女孩的重量和颜值 和她们的朋友关系 现在有一个舞台 ab是朋友 bc是朋友 ac就是朋友 给出最大承重 可以邀请这些女孩来玩 对于每一个朋友团体 全邀请or邀请一个or不邀请 问能邀请的女孩的 ...

  2. HDU 1712 ACboy needs your help(分组背包)

    题意:给你n的课程组,每个课程组有m个课程,每个课程有一个完成时间与价值.问在m天内每组课程组最多选择一个,这样可以得到的最大价值是多少 题解:分组背包,其实就是每个课程组进行01背包,再在课程组内部 ...

  3. HDU 4341 分组背包

    B - Gold miner Time Limit:2000MS      Memory Limit:32768KB     Description Homelesser likes playing ...

  4. 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...

  5. 分组背包 例题:hdu 1712 ACboy needs your help

    分组背包需求 有N件物品,告诉你这N件物品的重量以及价值,将这些物品划分为K组,每组中的物品互相冲突,最多选一件,求解将哪些物品装入背包可使这些物品的费用综合不超过背包的容量,且价值总和最大. 解题模 ...

  6. #分组背包 Educational Codeforces Round 39 (Rated for Div. 2) D. Timetable

    2018-03-11 http://codeforces.com/contest/946/problem/D D. Timetable time limit per test 2 seconds me ...

  7. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...

  8. Codeforces 946D - Timetable (预处理+分组背包)

    题目链接:Timetable 题意:Ivan是一个学生,在一个Berland周内要上n天课,每天最多会有m节,他能逃课的最大数量是k.求他在学校的时间最小是多少? 题解:先把每天逃课x节在学校呆的最小 ...

  9. Codeforces 946D Timetable(预处理+分组背包)

    题目链接:http://codeforces.com/problemset/problem/946/D 题目大意:有n个字符串,代表n天的课表,1表示这个时间要上课,0表示不要上课,一天在学校时间为第 ...

  10. 【题解】洛谷P1273 有线电视网(树上分组背包)

    次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...

随机推荐

  1. python之日志记录loguru

    安装: pip install loguru 基础使用: from loguru import logger logger.debug("This is a debug...") ...

  2. 用文字“画出”状态图:用 AI+Mermaid.js 解决对象状态变化的处理问题

    什么是状态图 状态图用于描述对象在其生命周期内的状态变化及其处理,例如业务办理流程.病情处置等. 什么是Mermaid Mermaid.js是一个开源项目,它允许你通过简单的语法来绘制图表. 无论你是 ...

  3. ZAFU五月多校合训

    B. 进制 jbgg 今天在幼儿园学了进制转换,现在 jbgg 有一个十进制正整数 \(x\),jbgg 好奇是否存在这样一个进制 \(p\),使得 \(x\) 在 \(p\) 进制表示下的各个位上的 ...

  4. C# 企业微信消息推送对接,实现天气预报推送

    C# 企业微信消息推送对接,实现天气预报推送 迷恋自留地 准备工作 需要获取的东西1. 企业Id,2.应用secret 和 应用ID 获取企业id 注册完成后,在我的企业=>企业信息=>最 ...

  5. 对象存储 COS 推出一站式内容审核服务,助力打造绿色互联网

    今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...

  6. Server check fail, please check server xxx ,port 9848 is available

    [1]如果使用docker安装的nacos服务,2.x版本后增加了 grpc 通信并且增加nacos的集群端口上下偏移1000,创建容器时除了8848还需要把7848.9848都暴露出来.如:-p 7 ...

  7. mysql命令行创建数据库并设置字符集

    CREATE DATABASE test1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  8. linux shell移植,sh不支持数组及bash移植

    查看此时系统shell ls -al /bin/sh Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bou ...

  9. python安装pip出现No package python-pip available

    安装pip: 使用yum进行安装 yum install python-pip 1 若出现 No package python-pip available. 则解决方法如下:   yum -y ins ...

  10. Windows 记录开机后应用启动慢的问题

    最近大屏产品经常报一些开机启动的问题,工厂反馈厂测软件有些模块测试不通过,家里开发测试均发现Launcher等软件首次启动需要加载10多秒. 经过小伙伴们排查,发现是刷母盘后首次开机问题概率比较大.使 ...