正整数n拆分成几个不同的平方数——DFS&&打表

考虑将正整数n拆分成几个不同的平方数之和,比如30=1^2 + 2^2 + 5^2=1^2 + 2^2 + 3^2 + 4^2,而8不存在这样的拆分。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 1000 + 10;
 5 bool vis[maxn];
 6 vector<int>res;
 7
 8 bool dfs(int n)
 9 {
10     //printf("%d\n", n);
11     if(n == 0)  return  true;
12     for(int i = 1; i * i <= n;i++)
13     {
14         if(!vis[i])
15         {
16             vis[i] = true;
17             res.push_back(i);
18             if(dfs(n - i*i))  return true;  //有一个满足条件的分解即可返回
19             vis[i] = false;
20             res.pop_back();
21         }
22     }
23     return false;
24 }
25
26 int main()
27 {
28     int cnt = 0;
29     for(int i = 1; i < 1000;i++)
30     {
31         memset(vis, 0, sizeof(vis));
32         if(!dfs(i))  printf("%d  %d\n",++cnt, i);
33     }
34
35     return 0;
36 }

只有31个数无法分解:2,3,6,7,8,11,12,15,18,19,...,108,112,128,在10^18内只有31个,更大的没有验证。

题目链接

原文地址:https://www.cnblogs.com/lfri/p/11140578.html

时间: 2024-10-09 09:28:43

正整数n拆分成几个不同的平方数——DFS&&打表的相关文章

【算法】将正整数表示为平方数之和

问题来源 Timus Online Judge 网站上有这么一道题目:1073. Square Country.这道题目的输入是一个不大于 60,000 的正整数,要求计算出该正整数最少能够使用多少个正整数的平方和来表示.这道题目的时间限制是 1 秒. 问题解答 <数论导引(第5版)>([英]G.H.Hardy.E.M.Wright 著,人民邮电出版社,2008年10月第1版)第 320 页有以下定理: 定理 369(Lagrange 定理): 每个正整数都是四个平方数之和 在这个定理中,平方

sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表

USE [tms]GO/****** Object: UserDefinedFunction [dbo].[fn_StrToTable_Double] Script Date: 2017/4/26 9:07:38 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: HXQ-- Create date: 2016年8月9日18:0

UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理

一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111.上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今.ASCII码一共规定了128个字符的

把1到100的数字拆分成字典中的两个键值对 python

需求:把1到100的列表拆分成字典中两个键值对,k1和k2. #!/usr/bin/python num = {} all_list = [] for nu in range(1101): all_list.append(nu) for i in all_list: if i < 75: if 'k1' in num.keys(): num['k1'].append(i) else: num['k1'] = [i, ] else: if 'k2' in num.keys(): num['k2']

将log4j2的配置文件log4j2.xml拆分成多个xml文件

在日常的项目开发中,我们可能会使用log4j2分离系统日志与业务日志 ,这样一来,log4j2.xml 这个配置文件可能就会变得非常臃肿.庞大,那么我们可以将这个文件拆分成多个配置文件吗? 答案是肯定可以的,现在我们就来拆拆看: 假如最初的配置文件是这样的: <?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF"> <Properties&

veridata实验举例(5)修改主键上的列值,update操作会被拆分成两条语句

veridata实验举例(5)修改主键上的列值,update操作会被拆分成两条语句 续接"veridata实验举例(4)验证veridata查找出updata.delete操作导致的不同步现象",地址:点击打开链接 环境: Item Source System Target System Platform Red Hat Enterprise Linux Server release 5.4 Red Hat Enterprise Linux Server release 5.4 Hos

Light OJ 1278 Sum of Consecutive Integers N拆分成连续整数和

题目来源:Light OJ 1278 Sum of Consecutive Integers 题意:N拆分成连续整数和的方案数 思路:奇因数的个数 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; //筛素数 const int maxn = 10000010; bool vis[maxn]; int prime[10

字符串分割函数--拆分成多行(转)

--字符串拆分成行 declare @str varchar(8000)  set @str = 'a1,b1,c2,d1,e3,f5'  --,换成 union all select set @str = 'select  name='''+replace(@str,',',''' union all select ''')+''''  exec(@str) /*name  ----  a1 b1 c2 d1 e3 f5 */ --字符串分割函数--拆分成多行 create function

将文本 按 分隔符 拆分成临时表(fn_split_text)

/* ************************************************************* 名 称: fn_split_text 功能简介: [将文本 按 分隔符 拆分成临时表] 参数简介: [@text] 需拆分的文本 返回: 表: subcolstr :拆分的字符串 特别说明: select * from fn_split_text('XXXX,YYYY,DDDD') *******************************************