设F[i,j]为长度为i是,前缀和为j的方案数。

【转移】

F[i,j] => F[i+1,j+i]

F[i,j] => F[i+1,j-i]

【原理】

由于A[0]=0,所以有A[1]=-1或A[1]=1 。又要满足|A[i]-A[i-1]|=1,所以 这样思考:

从F[i,]转移到F[i+1,]时,假象在长度为i的A序列后添一个A[i]+1 或A[i]-1。我们惊奇地发现,这样是做不出来的。

怎么办呢???

看过题解后我们发现,上述方法不适用的原因是A[n]情况太多了。不方便。 与之相反的是,A[0]={0},A[1]={1,-1}的情况就很少 。我们何不在A[0]和A[1]中插入一个数构成新序列呢 ??

举个栗子:当A[1]为1时,在其中插入一个1,为了满足 |A[i]-A[i-1]|=1 的性质,不得不当原来的A[1~i]都加上一个1或-1,即转移到了F[i+1,j+i-1+1] 和 F[i+1,j-i+1-1] 。

还有三种情况,道理相同就不再赘述了。

【输出答案】搜索,利用F数组剪纸就好。

我是真菜啊 。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std; const int N=110;
const int M=20000; int n,sum,a[N];
long long tot,f[N][M+1]; void print(int x) {
if(x==1 && !sum) {
printf("0");
for(int k=0,i=n; i>1; --i) {
k+=a[i]; printf(" %d",k);
}
printf("\n");
if(--tot==0) exit(0);
}
if(f[x][sum<0?sum+M:sum]==0) return;
a[x]=-1;
sum+=(x-1);
print(x-1);
sum-=(x-1);
a[x]= 1;
sum-=(x-1);
print(x-1);
sum+=(x-1);
} int main() {
f[1][0]=1;
scanf("%d%d",&n,&sum);
for(int i=1,j,k; i<n; ++i) {
for(int s=-9999; s<=9999; ++s) {
j=s;
if(j<0) j+=M;
if(!f[i][j]) continue;
k=s+i;
if(k<0) k+=M;
f[i+1][k]+=f[i][j];
k=s-i;
if(k<0) k+=M;
f[i+1][k]+=f[i][j];
}
}
if(sum<0) tot=f[n][sum+M];
else tot=f[n][sum];
printf("%lld\n",tot);
if(tot>100) tot=100;
print(n);
return 0;
}

[P1329] 数列的更多相关文章

  1. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. BZOJ1500[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  3. PAT 1049. 数列的片段和(20)

    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...

  4. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  5. fibonacci数列(五种)

    自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...

  6. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  7. 洛谷 P1182 数列分段Section II Label:贪心

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  8. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  9. 代码的坏味道(4)——过长参数列(Long Parameter List)

    坏味道--过长参数列(Long Parameter List) 特征 一个函数有超过3.4个入参. 问题原因 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个算法 ...

随机推荐

  1. canvas(四) Gradient- demo

    /** * Created by xianrongbin on 2017/3/9. */ /* strokeStyle 或 fillStyle 属性的值*/ /** * Demo1 创建线性渐变 */ ...

  2. java_19List 集合

    1List集合 有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素. 与 s ...

  3. 前端移动开发之rem

    前言 作为一名前端工程师,我们不仅要会PC端开发,还要会移动端开发,而且现在移动端占据主要流量,所以掌握移动端开发的技能更是必须的. 那么进行移动端的开发,什么是必须,我们想要的效果是什么? 自适应. ...

  4. 20175234 2018-2019-2 《Java程序设计》第三周学习总结

    20175234 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容重难点总结 关于驼峰式的认识 为了增加程序的可读性,除了在代码之间增加注释之外,程序员大都把代码中 ...

  5. Python开发——基础

    注释 单行注释 # 被注释的内容 多行注释 """ 被注释的内容 """ 解释器路径 #!/usr/bin/env python # 用于L ...

  6. js data日期初始化的5种方法

    var objDate=new Date([arguments list]);  参数形式有以下5种: 1)new Date("month dd,yyyy hh:mm:ss");  ...

  7. oracle服务端与客户端字符集不同导致中文乱码解决方案

    1.问题描述 用pl/sql登录时,会提示“数据库字符集(ZHS16GBK)和客户端字符集(2%)是不同的,字符集转化可能会造成不可预期的后果”,具体问题是中文乱码,如下图 2.问题分析 不管错误信息 ...

  8. STM32 + RC522(SPI2 和 模拟SPI)

    STM32 + RC522(SPI2 和 模拟SPI) 一. STM32 + RC522(SPI2 模式) 1. 头文件: rc522.h #include "stm32f10x.h&quo ...

  9. MFC树形控件的使用(右键点击)

    在MFC中,会用到树形控件,这里做下记录. 右键点击 1.添加右键点击事件(NM_RCLICK) 2.获得鼠标在Client的坐标 CPoint point; GetCursorPos(&po ...

  10. 11. English vocabulary 英语词汇量

    11. English vocabulary 英语词汇量 (1) The exact number of English words is not known.The large dictionari ...