四平方和定理 leetcode279 c++
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n =
12
输出: 3
解释:
12 = 4 + 4 + 4.
示例 2:
输入: n =
13
输出: 2
解释:
13 = 4 + 9.
很多人第一眼看到这个问题,想到的第一种做法就是使用贪心算法,但是对于这个问题是不适用的,例如:
如果贪心来做,12 = 9 + 1 + 1 + 1,所以答案为4了,但是实际答案是3。
Lagrange 四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。
引理 1 (Euler 四平方恒等式): (a2+b2+c2+d2)(w2+x2+y2+z2) = (aw+bx+cy+dz)2 + (ax-bw-cz+dy)2 + (ay+bz-cw-dx)2 + (az-by+cx-dw)2, 其中 a, b, c, d, w, x, y, z 为任意整数。
引理 2: 如果一个偶数 2n 是两个平方数之和, 那么 n 也是两个平方数之和。
引理 3: 如果 p 是一个奇素数, 则存在正整数 k, 使得 kp = m2+n2+1 (其中 m, n 为整数)。
还有一个重要的推论:
我们可以先判断这个数是否满足,如果是,那就ans=4;
完整代码为
class Solution{
private:int is_square(int n){int sqrt_n = (int)(sqrt(n)); //强制转换 int i;float f; f=(float)i;return (sqrt_n*sqrt_n == n);}
public:int numSquares(int n){// If n is a perfect square, return 1.if (is_square(n)){return 1;}// The result is 4 if and only if n can be written in the // form of 4^k*(8*m + 7). Please refer to // Legendre's three-square theorem.while ((n & 3) == 0) {// n%4 == 0 n >>= 2; //左移2位 4^a}if ((n & 7) == 7){ // n%8 == 7return 4;}// Check whether 2 is the result.int sqrt_n = (int)(sqrt(n));for (int i = 1; i <= sqrt_n; i++){if (is_square(n - i*i)){return 2;}}return 3; //其他是3}
};
不过这题用动态规划很容易理解
class Solution{
public:int numSquares(int n) {if (n <= 0) {return 0;}vector<int> cntPerfectSquares(n + 1, INT_MAX);cntPerfectSquares[0] = 0;for (int i = 1; i <= n; i++) {// For each i, it must be the sum of some number (i - j*j) and // a perfect square number (j*j).for (int j = 1; j*j <= i; j++) {cntPerfectSquares[i] = min(cntPerfectSquares[i], cntPerfectSquares[i - j*j] + 1);}}return cntPerfectSquares.back();}
};
四平方和定理 leetcode279 c++相关推荐
- leetcode279 拉格朗日四平方和定理
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 输入: n = 12 输出: 3 解释: 12 = 4 + ...
- 两数平方和定理,勒让德三平方和定理,拉格朗日四平方和定理
婆罗摩笈多-斐波那契恒等式 婆罗摩笈多-斐波那契恒等式(Brahmagupta–Fibonacci identity): ( a 2 + b 2 ) ( c 2 + d 2 ) = ( a c − b ...
- Pollard_rho大数质因数分解+拉格朗日四平方和定理(bzoj 2904: 平方和)
2904: 平方和 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 160 Solved: 73 [Submit][Status][Discuss] ...
- 拉格朗日四平方和定理
目录 一,拉格朗日四平方和定理 二,证明过程 三,推论 四,OJ实战 CSU 1404 Four-square Theorem 力扣 279. 完全平方数 一,拉格朗日四平方和定理 每个正整数均可表示 ...
- 第四平方和定理,用c语言实现
1.实验题目 1.7[问题描述] 第四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和.比如:5 = 0^2 + 0^ ...
- xjoi 1542 玩玩拉格朗日四平方和定理
题目描述: 拉格朗日四平方和定理: 每一个非负整数都可以表示成四个非负整数的平方和. 例如 5 = 0^2 + 0^2 + 1^2 + 2^2 给定一个正整数n,请你将n拆成 a^2+b^2+c^2+ ...
- C语言编程四平方和定理,第四平方和定理,用c语言实现
1.实验题目 1.7[问题描述] 第四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和.比如:5 = 0^2 + 0^ ...
- 四平方和定理(拉格朗日定理)
题目 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 ...
- 【LeetCode】279. 完全平方数 【动态规划】【四平方和定理】
题目链接:https://leetcode-cn.com/problems/perfect-squares/ 题目介绍 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使 ...
最新文章
- winform实现翻书效果_如何用PPT实现翻书效果?
- 分布式大数据sql查询引擎Presto初识
- 百度SEOB2B/论坛/网站自动更新/发布程序
- Spark写入MySQL报错乱码+报错
- linux网络协议栈 转发组播,Linux 网络协议栈开发基础篇(十)—— 组播(Multicast)基础...
- poj 3624 Charm Bracelet (01背包)
- Virtio SCSI设备介绍
- Salesforce入门教程(中文)-020 VF使用静态资源移动端开发(未完)
- echo命令的15个用法
- 百度相关搜索是怎么出现的如何利用
- win2008 mysql 群集_win2003服务器下配置 MySQL 群集(Cluster)的方法 -电脑资料
- [LeetCode]Burst Balloons 爆气球
- 文件服务器 excle 变为temp,WPS的excel表格保存之后变成tmp_共享文档无法保存EXCLE 生成TMP...
- ipad微信号无法连接服务器,ipad微信内置浏览器无法微信登录
- 内网异地备份_用批处理实现局域网内的异地备份
- 数据分析项目实战项目二:入驻商用户画像体系
- 咖说 | 「延展与重构」数字艺术的新可能
- 最大扇入数怎么判断_实战分享——百家号怎么运营获得稳定收益
- 电脑中常用的“扇区”、“簇”、“块”、“页”等概念
- 工程材料(3.2)热处理-普通铸铁