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. Springboot优雅读配置文件

    转载自Springboot优雅读配置文件 很多时候我们需要将一些常用的配置信息比如阿里云oss配置.发送短信的相关信息配置等等放到配置文件中. 下面我们来看一下 Spring 为我们提供了哪些方式帮助 ...

  2. 十、Spring Boot集成Spring Security之HTTP请求授权

    目录 前言 一.HTTP请求授权工作原理 二.HTTP请求授权配置 1.添加用户权限 2.配置ExceptionTranslationFilter自定义异常处理器 3.HTTP请求授权配置 三.测试接 ...

  3. JAVA开发规范v1.0

    01-中铜国贸JAVA开发规范v1.0 一.编程规约 (一)命名风格 [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:_name / _name / $Obje ...

  4. JEP 462 结构化并发是一个很愚蠢的提案

    https://openjdk.org/jeps/462 Motivation Developers manage complexity by breaking tasks down into mul ...

  5. 【信号与系统】求使系统稳定的常数K的范围

  6. Java代码覆盖率super-jacoco

    开源项目地址 https://gitee.com/didiopensource/super-jacoco 项目流程 项目架构 部署步骤 注意:一定要用Linux服务器部署,不要用Windows 准备L ...

  7. 性能测试 -- docker部署grafana

    一.前提 1.安装好了docker 2.docker内 和 jmeter脚本 全都已经部署好了influxdb,并且数据采集等都正常 二.docker 部署 grafana 的操作步骤 1.下载 do ...

  8. Sealos Devbox 基础教程:使用 Cursor 从零开发一个代码猜古诗小游戏

    给你一段代码,让你根据代码来猜对应的古诗词,你能猜对吗? 这不是玩笑,还真有人这么干 这是一张在 1024 程序员节流传的代码猜诗句小游戏,相信很多程序员小朋友都看到过. 今天我们将用魔法打败魔法,通 ...

  9. 总是被低估,从未被超越,揭秘QQ极致丝滑背后的硬核IM技术优化

    本文由腾讯云开发者张曌.毕磊分享,原题"QQ 9"傻快傻快"的?!带你看看背后的技术秘密",本文进行了排版和内容优化等. 1.引言 最新发布的 QQ 9 自上线 ...

  10. Kubernetes系列(一) - kubernetes入门基本概念

    目录 1. 基本概念 1.1 什么是 Kubernetes 集群 1.2 Kubernetes集群资源组成: 1.3 无状态和有状态的区别 1.3.1 无状态服务 1.3.2 有状态服务 2. Kub ...