设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. 监测SQLServer数据库中表的数据变化 方案

    sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...

  2. 关于C语言头文件写法的探讨

    我不是软件工程出身,对于这方面一直处于探索阶段. 目前按照这样的习惯吧. 除主函数所在的文件以外,为每一个源文件配置一个头文件. 头文件里面不能写变量的申明和定义.头文件里面只写 #define,st ...

  3. cobbler的ks文件带有特殊字符导致错误

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAykAAACWAQMAAADg0FUUAAAAAXNSR0IArs4c6QAAAAZQTFRFq6urAA

  4. redis 动态修改配置与备份文件目录

    redis-cli -c -h 10.1.1.1 -p 7000 获取所有可以配置的KEY config get * 设置KEY config set * 配置重新写入配置文件 CONFIG REWR ...

  5. 真机调试adb:wait for device 解决方案

    1.adb logcat 命令的时候,cmd总是提示adb server did't ACK.       分析一下,明显adb server没有开启成功,服务启动失败一般都是端口绑定失败,所以我们只 ...

  6. [剑指Offer]36-二叉搜索树与双向链表

    链接 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPa ...

  7. tar --exclude排除指定目录打包

    ----before-upgrade./ --exclude=apache-tomcat-/logs --exclude=apache-tomcat-/work 注意,--exclude后面跟路径名称 ...

  8. linux下sort命令使用详解---linux将文本文件内容加以排序命令

    转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...

  9. Android手机上浏览器不支持带端口号wss解决方案

    首先抄个示例过来,命名为wss-test.html,然后传到服务器: <!DOCTYPE HTML> <html> <head> <meta http-equ ...

  10. LOJ-10108(欧拉回路+并查集)一个图至少用几笔画成

    题目链接:传送门 思路: 用并查集统计出每个区块奇数个节点的个数x,每个区块对笔画的贡献是max(x/2,1): 然后每个区块求和即可. #include<iostream> #inclu ...