首页 > 编程知识 正文

哈希表C018LQ四平方和map记录差 推导上限

时间:2023-05-04 22:39:14 阅读:179356 作者:490

四平定理,又称拉格朗日定理:

每个正整数最多可表示为4个正整数的平方和。

包括0在内,正好可以表示为四个数的平方和。

例如()符号是乘方的意思) ) ) ) ) ) ) ) ) )。

5=0^2 0^2 1^2 2^2

7=1^2 1^2 1^2 2^2

对于给定的正整数,平方和的表示法可能存在多个。

你要求对四个数进行排序:

0=a=b=c=d

然后,对于所有可能的表示法,a、b、c、d用联合主键按升序排列,最后输出最初的表示法

在程序中输入正整数n(n5000000 )

输出4个非负整数,按照从小到大的顺序排序,之间需要用空格分开

例如,在输入: 5的情况下,为0 0 1 2,例如,在输入: 12的情况下,为0 2 2 2,例如,在输入: 773535的情况下,输出:1 1 267 838方法1:map记录差分拒绝用上限决定困难暴力法,使用差分法将两个平方数ab先确定

主要是很难确定上限呢。 这里是上限不明确导致的超时…

# include bits/stdc.husingnamespacestd; typedef long ll; int main () STD : IOs :3360 sync _ with _ stdio (false ); CIN.Tie(0; cout.tie(0; int n; cinn; unordered_mapint,int book; for(inta=0; a*a=n/2; a ) for(intb=a ); b*b=n-a*a; b ) if ) book.find(a*ab*b )==book.end ) ) { book[a*a b*b]=a; }for(intc=0; c*c=n/2; c ) for(intd=c ); d*d=n/2-c*c; d ) { int t=n-c*c-d*d; if(book.find(t )!=book.end () ) { int a=book[t],b=int ) sqrt(n-a*a ) ); cout c ' ' d ' ' a ' ' b; 返回0; } } return 0; } 复杂度分析

3358www.Sina.com/:o(nn ) o ) sqrt ) n ) sqrt(n ) (o ) o ) nn )、Time: O ) )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。