[P1329] 数列
设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] 数列的更多相关文章
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- 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 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 代码的坏味道(4)——过长参数列(Long Parameter List)
坏味道--过长参数列(Long Parameter List) 特征 一个函数有超过3.4个入参. 问题原因 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个算法 ...
随机推荐
- 绑定checkedComboBox
using System; namespace CommonLib{ /// <summary> /// CommonCode 的摘要说明. /// </summary> [S ...
- mysql查询语句中自定义变量(转)
转:http://blog.sina.com.cn/s/blog_1512521570102wrfl.htmlselect cost,@a:=@a+1 from testone,(select @a: ...
- MySQL经典练习题
表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...
- Codeforces Round #499 (Div. 2)
Codeforces Round #499 (Div. 2) https://codeforces.com/contest/1011 A #include <bits/stdc++.h> ...
- Python开发【第六篇】:面向对象
configparser模块 configparser用于处理特定格式的文件,其本质是利用open来操作文件. 文件a.txt [section1] k1 = 123 k2:v2 [section ...
- sql-多表查询
一:外连接 1.左外连接(left join) select * from A left join B on A.id=B.a_id 结果如下 很明显,A表的所有数据都显示出来了 ...
- C++中重载操作符[ ]
1.首先说说为什么要重载操作符[ ] 主要是因为系统只给了整数类型(int)的重载函数,即只能在方括号中输入整数进行查找,但有时候我们可能存放数据时,下标的类型是自定义的,希望也能像数组直接通过下标访 ...
- day3-selenium的使用及
如果是python2的情况下需要设置: # _*_ coding:utf-8 _*_,这样的编码来保证输入中文在运行时不会报错,另外在中文的前边加上u保证编译时不会报错 from selenium i ...
- sendmail发送邮件
#echo 'hello!' | mail -s "hello test" 119733@qq.com
- 20165213周启航java学习总结
20165213周启航java学习总结 一.每周博客链接及二维码 预备作业一:我所期望的师生关系:http://www.cnblogs.com/rocedu/p/6255835.html#WEEK15 ...