第一题:数列
提交文件:sequence.pas/c/cpp
输入文件:sequence.in
输出文件:sequence.out
问题描述:
把一个正整数分成一列连续的正整数之和。这个数列必须包含至少两个正整数。你需要求出这个数列的最小长度。如果这个数列不存在则输出-1。
输入格式:
每行包含一个正整数n。
每个文件包含多行,读入直到文件结束。
输出格式:
对于每个n,输出一行,为这个数列的最小长度。
输入样例: |
输出样例: |
9 2 |
2 -1 |
数据范围:
对于所有数据,n≤263。
解题报告:
列举数据进行分析可以发现连续等差数列具有单调递增对称性,数列可以表示为ai...a2a1xb1b2...bi,其中x为数列的对称点,x可以是一个数,它的值为x=(a1+b1)/2,如果x不是一个数,那么b1-a1=1,同时有a1+b1=a2+b2=...=ai+bi,进一步分析可以发现数据本身可根据奇偶性进行分解:当n为奇数时,解为2;当n为偶数时则进行因子分解,求出最小的奇数因子,该最小奇数因子即为问题解,但是也有特殊情况,例如0,1,2,3,4数列它的长度为5,而实际长度是4,所以对奇数序列如果出现数列延伸到0和负数范围时就需要进行调整。
在上面的分析基础上,利用数列的对称性,特殊处理n为奇数和n=1的情况,对n为偶数直接枚举数列长度,对数列长度本身也具有奇偶性,遇到奇数序列长度则判断:n是否能 整除数列长度 如果是则为解;遇到偶数序列长度则判断:n整除数列长度的余数是否为序列长度的一半,如果是则为解。
好复杂。考试时绝对想不到。
本想骗几分的,竟每组数据都有一个值“11393000946249