首页 > 其他分享 >Codeforces 232 B Table 题解 [ 蓝 ] [ 分组背包 ] [ 组合数学 ] [ 循环节 ]

Codeforces 232 B Table 题解 [ 蓝 ] [ 分组背包 ] [ 组合数学 ] [ 循环节 ]

时间:2024-08-15 22:29:25浏览次数:16  
标签:题解 ll Codeforces 正方形 一列 Table 点数 dp mod

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;
}

标签:题解,ll,Codeforces,正方形,一列,Table,点数,dp,mod
From: https://www.cnblogs.com/zhr0102/p/18361911

相关文章

  • AT_agc025_b RGB Coloring 题解
    ProblemSolution由于涂绿色的得分为\(A+B\),所以可以将红色与蓝色独立考虑。依次枚举红色的个数,假定为\(i\),所以剩余需要的得分为\(K-i\timesA\),判断是否能被\(B\)整除,若能,则蓝色个数为\(\frac{K-i\timesA}{B}\),设为\(j\),则总方案累加\(C^{i}_{n}\timesC^{j}_{n}\),除......
  • html table colgroup col 使用、功能测试
    代码<template><divclass="page-box"><!--colgroup使用方式1--><table><colgroup><colspan="2"style="width:100px"/><col......
  • [Ynoi2016] 镜中的昆虫 题解
    难度在最近遇到的题里相对较高,在这里写一篇珂学题解。(以下是学校给的部分分)\(20\%\):直接暴力枚举。另外\(20\%\):假如我们取\(pre\),对于\(pre<l\)的,\(ans++\),明显二维偏序,树状数组或\(cdq\)即可,时间复杂度\(O(n\logn)\)。另外\(40\%\):相当于多加一个时间维,三维偏序,\(......
  • DELPHI四舍五入问题解决
    转自http://www.delphitop.com/html/jichu/153.html 感谢原作者。 这段时间在用DELPHI做一个财务系统时发现每一行的小计取了两位小数后与用SQL的ROUND查询出来的不一样,在程序中是用FormatFloat('0.00',ItemSum)函数来取值的,再用DXDBGRID网格显视合计,最终与SELECTSUM(ROUND(......
  • Fdmemtable 内存表保存图片的例子
    varaStream:TMemoryStream;LDataSet:TFDDataSet;//申请一个FD数据集MyStream:Tmemorystream;MyJPEG:TJpegImage;MyPng:TPngImage;begininherited;ifimg2.Picture.Graphic=nilthenbeginApplication.MessageBox('没有图片可以增加!!','提示'......
  • 【问题解决】PageOffice打开word文档报错:Office运行时错误,部分系统文件可能丢失或已损
    打开wps,右上角配置和修复工具取消勾选,确定再打开,重新勾选,确定,退出重启电脑,验证。--PS:本人自测成功,有些人的机器安装有MicrosoftOffice,取消之后(不需要重新勾选)就可以了;本人机器只安装了WPS适合这种操作。......
  • P10633 BZOJ2989 数列/BZOJ4170 极光 题解
    题目传送门前置知识CDQ分治|权值树状数组及应用|曼哈顿距离与切比雪夫距离的相互转化解法增加一维为时间戳,那么操作\(1\)等价于单点加。曼哈顿距离直接跑CDQ分治,貌似不太可做,考虑转化为切比雪夫距离。原曼哈顿坐标系中的点\((x_{1},y_{1}),(x_{2},y_{2})\)间的......
  • Ubuntu中编译使用ANTs(医学图像配准)含github无法访问问题解决
    目录第一步、修改hosts文件1.打开https://github.com.ipaddress.com/ 2.打开https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfo3.打开hosts文件,并在文件末尾添加如下内容 第二步、编译ANTs1)首先安装git、cmake以及c++编译器2)编译3)配置bin目录,......
  • 【题解】CF - 823C : Coin Troubles
    原题传送门题目大意有\(N\)种硬币,两种硬币的面值可能相同。给定\(q\)个限制,第\(i\)个限制由\(b_i\)和\(c_i\)组成,表示第\(b_i\)种硬币的数量严格大于第\(c_i\)种硬币的数量,且每个\(b_i\)与\(c_i\)都是唯一的。问在满足所有限制的情况下,有多少种可能的方案,能组......
  • Django 数据库迁移:makemigrations 和 migrate 命令详解及常见问题解决
    目录1.问题所示2.pythonmanage.pymakemigrations3.pythonmanage.pymigrate4.拓展1.问题所示最初始的状态是遇到这个问题由于刚开始跑pythonweb项目,开源项目附带的Readme,个别命令不太懂,对此详细研究其基本知识最终的解决方案如下:清理迁移文件:删除迁移目......