比较好想的一道题,只是那个组合数比较恶心。

先说一下我最开始想的$n^4$的沙雕dp:

设f[i][j][k]为前i天给了j个,第i天给了k个,则f[i][j][k]=∑f[i-1][j-k][o];

复杂度凑起来大概是$n^4$,因为本来就是针对30%打的,没有考虑特别大的d。

观察上面的式子,发现第三维并没有什么卵用,把它干掉,f[i][j]表示前i天给j个,那么f[i][j]=∑f[i-1][k](j-m+1<=k<=j),复杂度$n^2d$,显然可以用前缀和优化,复杂度$nd$。

但是d太大还是会死,有位巨佬用矩阵快速幂优化拿到了90分%%%,貌似矩阵有什么规律(然而我并不会)。

题目中d很大,但是n却很小,所以实际有用的只有n天,所以递推到第n天后乘以$C_d^n$,这样对吗?根据以上状态定义,n天也不一定全部都给饼干,所以乘以$C_d^n$会算重,这个时候状态就要稍微修改一下,f[i][j]表示前i天共给了j个,且每天给的饼干数>0,这样就解决了重复的问题,那么最后答案就是$∑f[i][n]*C_d^i$.

然而他又爆了longlong,__int128拯救世界系列。

 #include<iostream>
#include<cstring>
#include<cstdio>
#define int LL
#define LL __int128
#define mod 998244353
#define ma(x) memset(x,0,sizeof(x))
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int n,m;
LL d;
inline LL read()
{
LL s=;char a=getchar();
while(a<''||a>'')a=getchar();
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
return s;
}
LL f2[][];
LL poww(LL a,int b)
{
LL ans=;
while(b)
{
if(b&)ans=(ans*a)%mod;
a=(a*a)%mod;
b=b>>;
}
return ans;
}
LL C(LL d,LL n)
{
LL jn=,js=;
for(int i=;i<=n;i++)jn=(jn*i)%mod;
for(int i=d-n+;i<=d;i++)js=(js*i)%mod;
return js*poww(jn,mod-)%mod;
}
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("0.out","w",stdout); while(scanf("%lld%lld%lld",&n,&d,&m))
{
if(!n&&!d&&!m)return ;
ma(f2);
if(1ll*d*(m-)<n){puts("");continue;}
if(d<=n)
{
for(int i=;i<m;i++)f2[][i]=;
for(int i=;i<=d;i++)
{
LL sum=;
for(int j=;j<=n;j++)
{
sum=(sum+f2[i-][j]);
if(j-m>=)sum=((sum-f2[i-][j-m])%mod+mod)%mod;
f2[i][j]=(f2[i][j]+sum)%mod;
}
}
LL ans=f2[d][n];
printf("%lld\n",ans%mod);
}
else
{
for(int i=;i<m;i++)f2[][i]=;
for(int i=;i<=n;i++)
{
LL sum=;
for(int j=max(,i-m);j<i;j++)sum=(sum+f2[i-][j])%mod;
for(int j=i;j<=n&&j<=i*(m-);j++)
{
if(j-m>=)sum=((sum-f2[i-][j-m])%mod+mod)%mod;
f2[i][j]=(f2[i][j]+sum)%mod;
sum=(sum+f2[i-][j]);
}
}
LL ans=;
for(int i=;i<=n;i++)
ans=(ans+f2[i][n]*C(d,i))%mod;
printf("%lld\n",ans%mod);
}
}
}

HZOJ 那一天我们许下约定的更多相关文章

  1. NOIP模拟测试6「那一天我们许下约定(背包dp)·那一天她离我而去」

    那一天我们许下约定 内部题,题干不粘了. $30分算法$ 首先看数据范围,可以写出来一个普通dp #include<bits/stdc++.h> #define ll int #defin ...

  2. HZOJ 20190719 那一天我们许下约定(dp+组合数)

    这个题目背景真的是让我想起了当年... 不说了,言归正传,这题,一眼看去30分暴力还是很好拿的,但我因为考试时的心态问题没有处理好细节爆了零. 30分暴力的普遍思路的复杂度应该是$O(nmd)$的,但 ...

  3. [CSP-S模拟测试]:那一天我们许下约定(DP+组合数学)

    题目传送门(内部题2) 输入格式 每个测试点有多组测试数据.对于每组数据,有一行共三个整数$N$,$D$,$M$含义如题.输入结束标识为$“0 0 0”$ (不含引号). 输出格式 对于每组数据,输出 ...

  4. HZOI2019 A. 那一天我们许下约定 dp

    题目大意:https://www.cnblogs.com/Juve/articles/11219089.html 读这道题的题目让我想起了... woc我到底在想什么?好好写题解,现在不是干那个的时候 ...

  5. 【模拟7.19】那一天我们许下约定(组合数学,DP)

    看了题目名字深切怀疑出题人是不是失恋了,然后出题折磨我们.然后这题就愉快的打了个暴力,最后莫名其妙wa20,伤心..... 其实这题正解不是很难想,如果说把暴力的DP搞出来,正解也差不到哪去了, 我们 ...

  6. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现

    一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现 导读:近日,马云.马化腾.李彦宏等互联网大佬纷纷亮相2018世界人工智能大会,并登台演讲.关于人工智能的现状与未来,他们提出了各自的观点,也引 ...

  7. [考试反思]0809NOIP模拟测试15:解剖

    说在前面: 不建议阅读.这里没有考试经验,只有一大堆负面情绪. 看了你不会有什么收获.看完了就不要怪我影响了你的心情. 以后不粘排行榜了.没什么意思没什么用. 但是我的意思并不是因为这次没考好的一时兴 ...

  8. 7.19 NOIP模拟6

    这次考试又一次让mikufun认识到了常数的重要性 T1.那一天我们许下约定 这题一看到D<=1e12,想都没想,矩阵快速幂!然后飞快的码了一个,复杂度n^3logD,让后我观察了一下这个转移矩 ...

  9. NOIP模拟 6

    考试时看了看T1,觉得是结论题,推了推没有成果,跑去看第二题, 题意很明确,求过定点的最小环,还没思考解题策略,然后觉得是水题 打了个tarjan找边双(据说会炸但是平均表现良好),在边双里暴力拆边找 ...

随机推荐

  1. WPF 动画执行后属性无法修改

    在做了一个类似QQ展开的动画时,设置了TopProperty,通过改变Window.Top属性来实现展开特效, 但是动画执行了之后,再去设置Window.Top的时候发现修改不了,代码调试后发现值设置 ...

  2. [jnhs]使用netbeans生成的webapp发布到tomcat是需要改名字的,不然就是404Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

    2018-12-21更新 退出tomcat然后删除解压之后的文件夹,然后再启动tomcat也可以解决(安装版tomcat) 2018-12-9更新 有时候这样也可以解决 第一次使用tomcat发布we ...

  3. 使用Jest进行单元测试

    Jest是Facebook推出的一款单元测试工具. 安装 npm install --save-dev jest ts-jest @types/jest 在package.json中添加脚本: “te ...

  4. 【模板】倍增LCA [2017年5月计划 清北学堂51精英班 Day3]

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  5. PHPStorm 批量选择,多光标同时编辑相同的内容

    一直按Alt+J

  6. Mac上的包管理器Homebrew的介绍及安装和使用实践

    Homebrew的作用 Homebrew是OS X上强大的包管理器,为系统软件提供了非常方便的安装方式,独特式的解决了包的依赖问题,并不再需要烦人的sudo,一键式编译,无参数困扰. 如何安装Home ...

  7. sqlserver 取月初月末的时间

    1.取月初的时间   --getdate() :2012/05/08  19:29:00 select convert(varchar,dateadd(day,-day(getdate())+1,ge ...

  8. Leetcode883.Projection Area of 3D Shapes三维形体投影面积

    在 N * N 的网格中,我们放置了一些与 x,y,z 三轴对齐的 1 * 1 * 1 立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上. 现在,我们查 ...

  9. linux下Nginx安装Zend Optimizer组件步骤

    注意:Zend Optimizer 在php5.3以上的版本已经集成了,所以php5.3以上的版本没必要安装了.而推出了Zend Guard Loader. http://www.zend.com/e ...

  10. JVM学习篇章(二)

     上节我们已经介绍了jvm和监控的一下方法,下面举例说明一下:  瓶颈问题定位: 内存泄漏原因定位: 1.常见的内存泄漏 2.定位的方法