你们这些写题解的,就不能把话说清楚嘛!(吐槽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. jqgrid 单列排序和组合排序

    有时,我们需要设置jqgrid表格按某个列排序,或则按多个列组合排序.如何实现? 1)设置可以排序的列  sortable: true 2)设置 multiSort: true 启用组合排序 $(&q ...

  2. [浅谈CSS核心概念] CSS布局模型:float和position

    1.流动模型 HTML元素在默认情况下都是按照"流动模型"进行布局的,网上也有人称之为"普通流"."文档流"之类的.这种布局模式的特点在于: ...

  3. Iframe和Frame中实现cookie跨域的方法(转载)

    在Iframe和Frame中默认是不支持Cookie跨域的,但通过设置P3P协议相关的响应头可以解决这一问题.关于p3p协议: P3P: Platform for Privacy Preference ...

  4. 蜻蜓fm面试

    一面: 面试官首先看简历上写了在腾讯的实习,然后就探讨了半天,各种虚拟化的技术.... 说完之后,估计都半小时过去了,然后就又说了一下你用什么语言,你做的东西都比较偏底层呢,然后你对工作有什么要求吗? ...

  5. Exp6 20155218 信息搜集与漏洞扫描

    Exp6 信息搜集与漏洞扫描 1.DNS IP注册信息的查询 1.进行whois查询时,要去掉www,ftp等前缀,否则可能在whois服务器中查询不到: 2.使用whois查询ip的地理位置: 2. ...

  6. python 字符串的split()函数详解

    split翻译为分裂.  split()就是将一个字符串分裂成多个字符串组成的列表. split()当不带参数时以空格进行分割,当代参数时,以该参数进行分割. //---当不带参数时 example: ...

  7. mfc 线程的优先级

    知识点:  线程优先级  获取当前线程句柄  线程优先级设置  线程优先级变动  线程优先级获取 一.线程优先级(Thread priority ) 简单的说就是(线程)的优先级越高,那么就 ...

  8. TMS320VC5509的MCBSP配置成SPI模式通信

    1. 首先是把MCBSP的配置 其次是时钟停止模式的配置,关闭大同小异 SPI有4中模式,怎么根据上面的寄存器选择哪种模式?下面展示了其中两种,CLKXP=1的时候有另外两种,暂时不整出来了 2. 代 ...

  9. [转]JVM系列三:JVM参数设置、分析

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  10. stl源码剖析 详细学习笔记 hashtable

    //---------------------------15/03/24---------------------------- //hashtable { /* 概述: sgi采用的是开链法完成h ...