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

先说一下我最开始想的$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. Mac Eclipse上Android SDK manager闪退的问题!!

    最近想自学一下Android,也没啥人指导,安装的过程中就花了一整天....安装完ADT,安装完SDK,所有步骤都照着网上来,可是一打开SDK manager就闪退!网上所有方法都找了,可是几乎全是w ...

  2. Django 创建web项目之HelloWorld

    Django.Flask.Tornado并称为python WEB三大框架.Diango是一个开源的web应用框架,具有开发速度快的特点.同时因为过度封装,具有性能低的特点. 创建Django项目,启 ...

  3. IO流4 --- IO流体系 --- 技术搬运工(尚硅谷)

  4. MySQL数据库起步 linux安装(更新中...)

    卸载mysql! [root@localhost usr]# yum remove mysql mysql-server mysql-libs compat-mysql51 [root@localho ...

  5. 使用JSONObject进行序列化时,避开定义get或set为开头的方法名称

    从结果中可以看到,JSONObject对Test对象进行序列化时,把fileName也当做属性了. 原因:涉及到JavaBean规范(参考:https://www.cnblogs.com/yusimi ...

  6. QT_获取正在运行程序的进程id(判断程序是否正在运行)

    bool checkProcessRunning(const QString &processName, QList<quint64> &listProcessId) { ...

  7. 洛谷 P3434 [POI2006]KRA-The Disks 贪心

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输出样例 输出样例 说明 思路 AC代码 题面 题目链接 P3434 [POI2006]KRA-The Disks 题目 ...

  8. Leetcode836.Rectangle Overlap矩阵重叠

    矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角或边接触的 ...

  9. LeetCode --- Validate Binary Search Tree

    题目链接 判断一颗二叉树是否是二叉搜索树(二叉排序树),也就是BST 如果该二叉树是BST, 那么对其中序遍历,所得序列一定是单调递增的(不考虑有重复数值的情况) 附上代码: /** * Defini ...

  10. Jeff Dean 光辉事迹

    这是Google 2007年的愚人节笑话,罗列了很多Jeff Dean的“光辉事迹”.大名鼎鼎的Jeff Dean想必不用我介绍了.……好吧,还是介绍一下,Jeff Dean是Google最早的一批员 ...