你们这些写题解的,就不能把话说清楚嘛!(吐槽1)

你们这些出题的,就不能多出点东方嘛!(吐槽2)

你们这些做题的,就不来写一篇详细一点的题解嘛!(吐槽3)

以上均是个人吐槽,纯属吐槽,不带任何针对性和感情色彩。


声明:

本题解适宜蒟蒻(比如我等)观看,若卡关,可以来此题解领提示。

小金羊写的题解致力于让刚刚学习二维数组的同学都能明白!!

把我顶上去让像我一样的juruo明白一下


回到正题。

首先还是看看这个题咋推出来的和杨辉三角&二位前缀和有关系?

我自己用python 3先手推了一下组合数,

先上python 3推组合数的代码:

import os
def jc(num):
if num is 0 or num is 1:
return 1
else :
return num*jc(num-1)
#阶乘递归版,适用于自己造的小型数据
#不是机惨w......
def zhs(i,j):
if i > j :
return 0
else :
return jc(j)/(jc(i)*jc(j-i))
#组合数配合阶乘递归,适用于小型数据推算 n=int(input())
while n is not 0:
n-=1
L=list(input().split())
print(zhs(int(L[0]),int(L[1])))
os.system("pause")
'''
print("Exit?",end=' ')
if input() is 'Yes':exit(1)
else :exit(1)
'''

一个个试一下,然后就发现这样一个鬼畜事件:



打眼一看:好像跟杨辉三角有那么点联系......

哦!缺了第一列的杨辉三角!

然后杨辉三角创造方法:\(O(1000^2\div 2)\)递推打表!

公式:

\[yh[i][j]=yh[i-1][j-1]+yh[i-1][j]
\]

别忘了取模(废话)


等等......

这个和此题有什么联系吗?

这个题让求组合数的和。

求和,先把区间用yellow色画出来。

然后发现......

(下图中填充黄色的是求和区域,紫色是和)



你发现了吗?这是一个二重的杨辉三角!

其实就是一个二维的前缀和预处理工作。

没有事情干的同学,树状数组&线段树都可解决这个问题。

根本就是两次递推打表!

然后这个题第一次我竟然只有10分......


但是要追求一个最优的方法。

这个时候我们要改一下原先的变量定义,是关于ans[i][j]方面:

ans[i][j]表示的是前i列前j行的前缀和。

推出这个题前缀和公式的过程:

杨辉三角到底有什么好处?

其实杨辉三角给你预处理了单列上的前缀和。

然后单列上前缀和用汉语表示就是:

杨辉三角形第i列上前j行の前缀和就是杨辉三角形第i+1行第j+1列上的数据。

数学公式?(第一个中括号内暂定是1)

\[ans[1][j]=yh[1+1][j+1]
\]

根据以上推论,得出很多列的(就是二维的)前缀和推论。

汉语表达:

i+1列前j+1行的前缀和就等于前i+1列前j行的前缀和加上前i+1列第j+1行的前缀和(即杨辉三角形第i+2行第j+2列那一项)。

公式?

\[ans[i][j]=ans[i][j-1]+yh[i+1][j+1]
\]

这样避免了许多不必要的记公式过程......

Upd4 2019/3/6:

有同学问,为啥是给你预处理了单列上的前缀和?

我们根据\(yh[i][j]=yh[i-1][j-1]+yh[i-1][j]\),

那么又\(\because yh[i-1][j]=yh[i-2][j-1]+yh[i-1][j]\)......

以此类推,得到yh[i+1][j+1],相当于我们得到了杨辉三角第j列的前i个数的和+\(yh[1][j]\)。

且根据我们杨辉三角靠左排列放置的方式,\(yh[1][j](j>0)\)必定为0。(观察可知\(yh[0][0]\)的右侧即\(yh[0][1]=0\),而右侧\(yh[0][1]\)和右侧数据都是0)

于是我们得出递推公式,ans[i][j]=ans[i][j-1]+yh[i+1][j+1]

到这里,我们找到了一个非常完美的没有过多数据+-的操作。

(qwq比cz dalao的算法的常数小)

坑点:

1.你以为取了mod就不会爆负数吗?太天真啦!

\(\therefore ans=(ans+mod)\)%\(mod\)

2.你以为我会\(O(2\cdot 1000^2)\)做吗?太天真啦!

复杂度\(O(1000^2\div 2+1000^2+query)\)


Upd1 2019/3/3:

关于代码和蒟蒻的二维前缀和求法补充完善

代码来辣!

求前缀和还是预处理吧......线段树什么的玩不来......

注意下面代码,求前缀和的时候意义和求杨辉三角的时候有所不同。

(原因见上面)

#include <iostream>
#include <cstdio>
#include <map> using namespace std;
typedef long long int lli;
const int maxn=1008;
const lli mod=19260817;
lli yh[maxn+1][maxn+1],ans[maxn+1][maxn+1];
int n,m,q; void Init()
{
for (register int i=0;i<=1004;i++)
{
yh[i][i]=1;
}
for (register int i=0;i<=1004;i++)
{
yh[i][0]=1;
}
for (register int i=2;i<=1004;i++)
{
for (register int j=1;j<=i;j++)
{
yh[i][j]=(yh[i-1][j-1]+yh[i-1][j]+mod)%mod;
}
}
//杨辉三角形的生成方式
for (register int i=1;i<=1004;i++)
{//前i列
for (register int j=1;j<=1004;j++)
{//前j行
ans[i][j]=(ans[i][j-1]+yh[i+1][j+1]+mod)%mod;
}
}
//二维前缀和的生成方式
}
int main()
{
Init();
scanf("%d",&q);
while (q--)
{
scanf("%d%d",&n,&m);
printf("%lld\n",ans[m][n]);
//注意ans[][]的定义!!
}
return 0;
}

Upd2 2019/3/3:

重新更正代码,实际4-WA,现在AC。

原因在于这个算法的局限性:

实际上需要推到1000+,时间复杂度上虽然小了,但是容易边界数据卡没了......

实际上我就是这样4-WA:read 0的......

题解 P5239 【回忆京都】的更多相关文章

  1. P5239 回忆京都

    题目地址:P5239 回忆京都 杨辉三角即组合数的"打表"形式 再求一个二维前缀和 然后处理一下负数即可(因为在求前缀和的过程中有减法) #include <bits/std ...

  2. 洛谷 P5239 回忆京都 题解

    题面 裸的杨辉三角前缀和,但----- 在求前缀和的时候有可能得到一个负数(由于取模的原因),所以一定要加上模数后再取模!!!! #include <bits/stdc++.h> #def ...

  3. P5239 回忆京都(洛谷3月月赛T2)

    题目描述 射命丸文在取材中发现了一个好玩的东西,叫做组合数. 组合数的定义如下:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合.所有组合的数量,就是组合数 ...

  4. 洛谷P5239 回忆京都

    和 NOIP2016TG 组合数问题 差不多是一样的-- 首先要知道杨辉三角和组合数之间的关系 看一下数据范围,很明显要避免重复计算,而且查询的复杂度要非常小 一看n, m <= 1000 这明 ...

  5. HBSX2019 3月训练

    Day 1 3月有31天废话 今天先颓过了就只剩30天了 初步计划 每天一道字符串/数据结构题 图论学习 根据<若干图论模型探讨>(lyd)复习 二分图与网络流学习 <算法竞赛进阶指 ...

  6. 5239-回忆京都-洛谷3月赛gg祭

    传送门 题目背景 第十五届东方人气投票 音乐部门 106名 第四次国内不知道东方的人对东方原曲的投票调查 51名 回忆京都副歌我tm吹爆,东方文花帖我tm吹爆! 题目描述 射命丸文在取材中发现了一个好 ...

  7. Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵

    E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...

  8. 【BZOJ1264】[AHOI2006]基因匹配Match DP+树状数组

    [BZOJ1264][AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而 ...

  9. 【BZOJ2795】[Poi2012]A Horrible Poem hash

    [BZOJ2795][Poi2012]A Horrible Poem Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串 ...

随机推荐

  1. PHP设计模式——訪问者模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: w ...

  2. Mike的农场 BZOJ4177

    分析: 最小割,不选则割的建模题...(然而一开始我当成了费用流,简直丧心病狂...最后想到了最小割...) 对于条件一,直接建一条双向边就可以了,并且不计入sum中,因为这是作为费用的存在,让它跑出 ...

  3. bitmap过大无法显示图片的问题 - z

    public Bitmap ratio(Bitmap image, float pixelW, float pixelH) {Bitmap bitmap = null;try {ByteArrayOu ...

  4. 20155306 白皎 《网络攻防》 EXP8 Web基础

    20155306 白皎 <网络攻防> EXP8 Web基础 一.问题回答 - 什么是表单 表单:一般用来收集用户的信息和反馈意见 表单包括两个部分:一部分是HTML源代码用于描述表单(例如 ...

  5. 20155325 Exp5 MSF基础应用

    目录 实验内容 遇到的问题 基础问题问答 老师!!!我实验三的C代码已经删除了,请求评分~~~ 实验内容 1.Windows服务渗透攻击--MS08-067 系统 虚拟机 参考博客 Windows X ...

  6. mfc CListBox

    通过ID操作对象 CListBox(列表框)控件 CListBox类常用成员 CListBox插入数据 CListBox删除数据 CListBox运用示例 一.CListBox类常用成员 CListB ...

  7. [CF1067D]Computer Game[凸包/斜率优化+倍增+矩阵乘法]

    题意 你有 \(n\) 个任务,初始收益为 \(a\) ,共 \(t\) 轮游戏,每轮可以选择完成一个任务(可以做多次),完成之后可以给任意任务升级,升级之后的任务收益为 \(b\) ,每个任务还有完 ...

  8. SSIS 组件属性整理

    整理SSIS 组件的属性解释及其用法 一,ExecValueVariable属性 有些Task组件执行完成之后,会产生输出结果,称作Execution Value,例如,Execute SQL Tas ...

  9. 利用 jrebel 热部署\远程调试\远程热部署 springboot项目 服务器上的代码

    首先要在eclipse 中启用 启用以后在 resource 中生成了 rebel-remote.xml 然后build,把生成的jar包放到服务器上. 然后用下面的命令启动 java -agentp ...

  10. 开源微信Http协议Sdk【实现登录/获取好友列表/修改备注/发送消息】

    基于微信Http协议封装的一个Sdk,目前实现了以下功能:. 1:扫码登录(检测二维码扫描状态) 2:获取最近联系人.群组.所有联系人 3:修改好友备注 4:给好友发送消息 暂且这么多,也没多余的时间 ...