蹭兄弟学校的题目做还不用自己出题的感觉是真的爽

题目描述

nodgd有一架快要坏掉的天平,这架天平右边的支架有问题,如果右边的总重量比左边多太多,天平就彻底坏掉了。现在nodgd手上有n种砝码,质量分别为m0,m1,m2,...,mn-1,每种砝码有k个。现在要把这n×k个砝码逐个放到天平上,每个砝码都可以放到天平的左边或者右边。放砝码的过程中,天平右边的总重量减去左边的总重量,必须严格小于已经放上天平的最重的一个砝码。如果L,R分别表示已经放上天平左边和右边砝码质量的可重集合,则任何时候都要满足

nodgd想知道放砝码的方案总数,答案mod 998,244,353后的值。两种放砝码的方法如果每次放上的砝码质量和放的位置都一样,则认为是相同的。输入格式输入文件。输入一行,包含三个正整数,含义如题目描述中所述。输出格式输出文件输出一个整数,放砝码方案总数后的值。

输入格式

输入一行,包含三个正整数n,m,k,含义如题目描述中所述。

输出格式

输出一个整数,放砝码方案总数mod 998,244,353后的值。

输入样例
  2 2 1
输出样例
  3

样例说明
  质量为1,2的砝码各有1个。如果先放质量为1的砝码,则两个砝码都只能放左边,有1种方案。如果先放质量为2的砝码再放质量为1的砝码,则质量为2的砝码只能放左边,质量为1的砝码随便放,有2种方案。共3种方案。
数据规模与约定
  对于30%的数据,n×k<=12;
  对于另外20%的数据,m=2,k=1;
  对于另外另外20%的数据,m=3,k=2;
  对于100%的数据,1≤n×k≤107,k<m≤107

分析

这道题我们拿到题目的版本要简单一些,是这个亚子的

(你™怎么连人名都换了)

所以我们先来证明一下在这个题目中

与最重的砝码个数左边应该不小于右边是等价的

对于一个质量为mi砝码,我们可以发现,它的质量其实是 比所有比它质量小的砝码 的质量之和还要大的,

所有比它质量小的砝码 的质量之和可表示为

k×(m0+m1+m2+m3+m4+...+mi-1)=k×$\frac {m^i-m^0}{m-1}$

显然这个函数随k单调递增,又因为k<m,即k最大为m-1

所以最大值为

k×$\frac {m^i-m^0}{m-1}$ =(m-1)×$\frac {m^i-m^0}{m-1}$ =mi-m0<mi

所以天平是否会坏掉只与当前最大砝码的摆放方式有关。

然而这只是这个题目的第一步

接下来我们开始正片

对于这种看一眼就很懵不知道怎么搞的题,我们可以考虑递推

如果固定n,由k推到k+1,增加的砝码质量都不同,不是很好推,所以考虑固定k由n推到n+1

我们试着从有n-1种砝码,每种砝码k个的情况推到n种砝码,每种砝码k个的情况。

设ansi表示i种砝码,每种砝码k个的方案数

不妨假设新增加的k个砝码是质量最小的那一堆(因为不会推最大的那一堆

那么根据样例的提示,对于第一个放上去的砝码进行讨论就有两种情况,一种是第一个放新增加,同时也是质量最小的砝码

另一种是放其它的,也是质量比新加的砝码质量要大的砝码。

如图,蓝色表示新的,红色表示以前的。

情形一                            情形二

对于第二种情况,天平是否会坏掉从一开始就与我们新增加的砝码无关,因为它们质量最小,

而天平是否会坏掉只与当前最大砝码的摆放方式有关。

所以这些砝码是可以乱放的,可以看作是插入到之前的砝码之中,但不能放到开头,而且每种砝码有左右两种选择

第二种情况的方案数就是ansn-1*C(nk-1,k)*2k

再回头来看看第一种情况,反正我还是觉得没什么思路

不过我们可以把第二种情形扩展一下,让它普遍一些。

第二种情况相当于在放第1个砝码的时候就放了质量比新增加的砝码大的砝码

而第一种情况相当于在放第i+1个砝码的时候就放了质量比新增加的砝码大的砝码(1≤i≤k)

两种情况合起来就是在放第i+1个砝码的时候就放了质量比新增加的砝码大的砝码(0≤i≤k)

那么就剩下k-i个砝码可以在以后乱放。

而前i个砝码的放置一定是合法的。

我们设f(i)表示i个同种砝码放置合法的方案数

那么总的方案数就是

ansn=ansn-1$\sum_{i=0}^k f(i) C_{nk-i-1}^{k-i}2^{k-i}$

只要知道f(i)就可以知道递推式了

而且ans1=f(k)

所以只要知道f(i)就可以计算答案

接下来我们来推一下f(i)

既然f(i)表示i个同种砝码放置合法的方案数

合法的意思就是左边的砝码不少于右边砝码

感觉有点像卡特兰数

我们可以用几何法解决

如果假设放左边一个砝码相当于向右走一步,放右边一个砝码相当于向上走一步

那么f(i)就表示从(0,0)走到直线x+y=i(y>=0)且不能越过直线x=y的方案数

越过x=y的情况时肯定到达了y=x+1(绿色直线)

作(0,0)关于y=x+1的对称点(-1,1),那么f(i)就是(0,0)走到黄色点的方案数-(-1,1)走到黄色点的方案数(有些黄色点没画)

所以

f(i)=C(i,i/2)-C(i,i/2+1)+C(i,i/2+1)-C(i,i/2+2).....+C(i,0)-C(i,-1)

=C(i,i/2)-C(i,-1)

=C(i,i/2)

我们终于可以得出答案

ans1=C_{k}^{k/2}

ansn=ansn-1$\sum_{i=0}^k f(i) C_{nk-i-1}^{k-i}2^{k-i}$

时间复杂度为O(nk)

分析过程贼长但最后依然还是挺短的代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
const int mod=;
int n,m,k,ans,fac[maxn],inv[maxn],bw[maxn],f[maxn];
int qp(int a,int k)
{
int res=;
while(k){if(k&)res=1ll*res*a%mod;a=1ll*a*a%mod;k>>=;}
return res;
}
void prework()
{
bw[]=fac[]=;
for(int i=;i<=;i++)bw[i]=2ll*bw[i-]%mod,fac[i]=1ll*i*fac[i-]%mod;
inv[]=qp(fac[],mod-);
for(int i=;i>=;i--)inv[i]=1ll*(i+)*inv[i+]%mod;
}
int C(int a,int b){return 1ll*fac[a]*inv[a-b]%mod*inv[b]%mod;}
int main()
{
scanf("%d%d%d",&n,&m,&k);
prework();ans=C(k,k/);
for(int i=;i<=n;i++)
{
int t=;
for(int j=;j<=k;j++)
t=(t+1ll*C(j,j/)*bw[k-j]%mod*C(i*k-j-,k-j)%mod)%mod;
ans=1ll*ans*t%mod;
}
printf("%d\n",ans);
}

【CSP模拟赛】坏天平(数学&思维)的更多相关文章

  1. CSP模拟赛游记

    时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...

  2. 【CSP模拟赛】Confess(数学 玄学)

    题目描述 小w隐藏的心绪已经难以再隐藏下去了.小w有n+ 1(保证n为偶数)个心绪,每个都包含了[1,2n]的一个大小为n的子集.现在他要找到隐藏的任意两个心绪,使得他们的交大于等于n/2. 输入描述 ...

  3. 【CSP模拟赛】方程(数学)

    题目描述 求关于x的方程:x1+x2+……xk=n的非负整数解的个数. 输入格式 仅一行,包含两个正整数n,k. 输出格式 一个整数,表示方程不同解的个数,这个数可能很大,你只需输出mod 20080 ...

  4. 【csp模拟赛5】限制 (restrict.cpp)--数学

    自己看吧: 爆搜代码: //春水初涨-春林初盛-春风十里-不如你 //----hzwer // 这是啥子题,读不懂-- //题意有问题 -- #include<iostream> #inc ...

  5. 【NOIP模拟赛】【数学真奇妙】【递推】旅行者问题

    旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...

  6. 【NOIP模拟赛】【数学真奇妙系列】纸盒子

    Task 1.纸盒子(box.pas/box.c/box.cpp) [题目描述] Mcx是一个有轻度洁癖的小朋友.有一天,当他沉溺于数学卷子难以自拔的时候,恍惚间想起在自己当初学习概率的时候准备的一堆 ...

  7. 【CSP模拟赛】Freda的迷宫(桥)

    题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过.  黄昏 ...

  8. [NOIP10.6模拟赛]1.merchant题解--思维+二分

    题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...

  9. [NOIP10.5模拟赛]3.c题解--思维

    题目链接 这次不咕了 https://www.luogu.org/problemnew/show/AT2389 闲扯 考场20分爆搜走人 \cy 话说这几天T3都很考验思维啊 分析 我们先钦定一只鸡( ...

随机推荐

  1. OO第4次博客作业

    OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...

  2. 几种常见的Preference总结

    DialogPreference共性 DialogPreference通用属性 说明 android:dialogIco 对话框的icon android:dialogLayout dialog的co ...

  3. UCOSIII内建消息队列

    使能内建消息队列 将OS_CFG_TASK_Q_EN置1 API函数 #if OS_CFG_TASK_Q_EN > 0u //删除 OS_MSG_QTY OSTaskQFlush (OS_TCB ...

  4. 虹软人脸识别SDK在网络摄像头中的实际应用

    目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容 ...

  5. 【spark】spark应用(分布式估算圆周率+基于Spark MLlib的贷款风险预测)

    注:本章不涉及spark和scala原理的探讨,详情见其他随笔 一.分布式估算圆周率 计算原理:假设正方形的面积S等于x²,而正方形的内切圆的面积C等于Pi×(x/2)²,因此圆面积与正方形面积之比C ...

  6. 优化API接口响应速度

    前言 API接口响应慢? SLA一直提不上去? 其实这是后端程序员想进阶必须要跨过去的坎:就是把它优化掉. 那么这其中到底有没有套路呢?答案是:有的. 本文将介绍目前正在用并且十分“无脑”有效的这个套 ...

  7. Linux 曝出严重安全漏洞,受限用户亦可提权至 Root 身份运行任意命令!(内附解决方案)

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  8. C++中与类有关的注意事项(更新中~~~)

    关于构造函数的调用次序,见下列代码 #include<iostream> using namespace std; class A { private: int x; public: A( ...

  9. MQ的面试题

    MQ的优点和缺点? 优点:解耦 异步,削峰 解耦: 所以需要用来解耦: 异步: 解决方法: 削峰: 解决方法是: 缺点:降低高可用性.增加系统的复杂程度.一致性问题 降低高可用的原因:系统引入的外部依 ...

  10. UVA 1672不相交的正规表达式

    题意 输入两个正规表达式,判断两者是否相交(即存在一个串同时满足两个正规表达式).本题的正规表达式包含如下几种情况: 单个小写字符 $c$ 或:($P | Q$). 如果字符串 $s$ 满足 $P$ ...