四平方和定理 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, ...)使 ...
最新文章
- 127. Leetcode 242. 有效的字母异位词 (哈希表)
- tkinter笔记:scale 尺度 (莫烦python笔记)
- 剑指offer-跳台阶
- SAP C4C Opportunity和SAP ERP Sales流程的集成
- VarianceThreshold
- 可显示上拼音下汉字的 text 格式
- 计算机怎么怎么打文件夹加密文件,电脑文件夹怎么加密 4种文件夹加密方法
- php转义和反转,PHP转义,反转义
- 平凡的女人,伟大的奉献
- 前端页面调用微信扫一扫功能
- SQL注入学习日记(一)
- 5分制绩点计算器_这道小学算术题,居然会让手机计算器“智障”
- c语言 星座运势,第十一周 OJ总结-日期妙算星座
- Hutool-crypto加密工具
- 怎么打造小红书爆款笔记账号?教你几招
- codeblocks如何去掉后面的dos窗口
- Vue.Draggable 文档总结
- Libreoffice 启动或重启命令
- linux3.0 usb键盘驱动,USB3.0驱动下载
- 【Linux操作】使用zip 压缩命令打包程序为.zip压缩包并进行解压缩
热门文章
- unix_timestamp、from_unixtime时间戳函数的使用
- 【实习之路】投了109份简历,幸运的大二菜鸡终于拿到欢聚时代的offer了!!
- python窗口大小动态变化_如何在tkinter中动态调整窗口大小以“自动调整”其内容?...
- 钕铁硼产品磁性能相对检测原理与技术
- telnet不是内部或外部命令怎么办
- 【干货】长达4万字的Java知识点!
- 阿里云服务器配置远程打印机,电脑启用打印服务器配置
- PXE+pxelinux+binlsrv+tftpd32远程安装windows 2003及心得
- UML之教学管理系统——1、需求分析
- Vi下编辑和退出编辑方法