一中OJ #1176 立方数分解[尼科梅彻斯定理] | 数论 + 枚举 | 解题报告

来源:互联网 发布:电子画板手绘软件 编辑:程序博客网 时间:2024/05/14 06:38

一中OJ | #1176 立方数分解[尼科梅彻斯定理]

时限 1000MS/Case 内存 64MB/Case





题目描述

任何一个正整数的立方都可以写成一串奇数之和,这就是著名的尼科梅彻斯定理


给出 N,求 N 的立方是哪 N 个连续奇数之和,要求第1个奇数尽量小。

输入格式

一个正整数N。

输出格式

连续奇数相加等于立方的算式。

样例输入

3

样例输出

7+9+11=27

数据范围

1 <= N <= 100

----------------------------------------------------------

题目分析

百度百科上写着,对于某数N,尼科梅彻斯定理算式开始的数为N^2-N+1

那么问题来了,题目要求开始的数最小

比如N=4,当开始的数为N^2-N+1时,4^3=(4*4-4+1)+15+17+19=64

那么题目描述里面的4^3=1+3+5+7+9+11+13+15=64怎么破呢

于是作为数论蒟蒻的我就开始推了

根据尼科梅彻斯定理,N^3=一串连续奇数之和

设该串连续奇数首项为A,末项为B,项数为C,B+A=D,B-A=E,那么N^3=(B+A)*C/2

因为A为奇数,B为奇数,B+A为偶数,那么D为偶数

从2开始枚举D,那么C=N^3*2/D,得到C

同时可以证明对于某连续奇数序列,C=E/2+1(我想这个应该是谁都会证了)

那么E=(C-1)*2

现在就得到五元一次方程组辣(N是已知数)

{

E=(C-1)*2

C=N^3*2/D

B+A=D

B-A=E

}

这个时候枚举D,就可以求出C与E

还剩下一个二元一次方程组(E和D都是已知数)

{

B-A=E

B+A=D

}

那么解出来,B=(E+D)/2,A=D-B

如果A,B均为奇数,并且A>0,那么一种解就找出来了,输出它

因为从2开始枚举D,那么一定能得到A+B的最小值,进而能求出最大的C(C越大,D就越小,B=A+(C-1)*2,那么D=2*(A+C-1),因为D最小,C最大,那么A肯定最小),就是题目要求的最优解

----------------------------------------------------------

代码

#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <set>#include <map>#include <queue>#include <stack>#include <vector>#include <cctype>#include <iomanip>using namespace std;int n,sum,cuberes,elenum,sx,mx;int main(){scanf("%d",&n);if(n==1){printf("1=1\n");return 0;}cuberes=n*n*n*2;for(int i=2;i<=cuberes;i+=2){if(cuberes%i!=0) continue;else{elenum=cuberes/i;elenum=2*(elenum-1);//混用一下变量名应该没人发现 mx=(i+elenum)/2;sx=i-mx;if(sx>0 && mx>0)if(sx%2==1 && mx%2==1){for(;sx<mx;sx+=2) printf("%d+",sx);printf("%d=%d\n",sx,n*n*n);return 0;}}}return 0;}



阅读全文
0 0
原创粉丝点击