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

先说一下我最开始想的$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. Spring线程安全的实现机制--ThreadLocal

    转载: http://blog.csdn.net/lufeng20/article/details/24314381

  2. DjangoORM查询、分页、ckeditor

    查询数据 Django的批量查询(查询所有,或者条件查询)返回的是queryset对象. Queryset对象是一个惰性对象,在不执行 1.排序 2.循环 3.截取 操作的情况下,不会遍历序列的内容. ...

  3. Vue-- vue-preview(图片查看器)的使用步骤:

    vue-preview的使用步骤: )下载 )配置:找到配置文件加入: { test: /vue-preview.src.*?js$/, loader: 'babel-loader' }, 在处理ur ...

  4. 关于502 bad gateway报错的解决办法

  5. vue中router以及route的使用

    路由基本概念 route,它是一条路由. { path: '/home', component: Home } routes,是一组路由. const routes = [ { path: '/hom ...

  6. UIImageView添加圆角

    最直接的方法就是使用如下属性设置: 1 2 3 imgView.layer.cornerRadius = 10; // 这一行代码是很消耗性能的 imgView.clipsToBounds = YES ...

  7. python fullmatch函数

  8. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...

  9. 【水滴石穿】react-native-book

    先推荐一个学习的地址:https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=12778558 ...

  10. 51nod1196 字符串的数量

    用N个不同的字符(编号1 - N),组成一个字符串,有如下要求:(1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以接 ...