51Nod 1080 两个数的平方和(数论,经典题)

1080 两个数的平方和

基准时间限制:1 秒 空间限制:131072 KB 分值: 5

难度:1级算法题

给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果有多种表示,按照i的递增序输出。

例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2 (注:3 11同11 3算1种)

Input

一个数N(1 <= N <= 10^9)

Output

共K行:每行2个数,i j,表示N = i^2 + j^2(0 <= i <= j)。
如果无法分解为2个数的平方和,则输出No Solution

Input示例

130

Output示例

3 11
7 9题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1080分析:又是一道大数据易超时的题,怎么做呢,降低复杂度,我的办法是让复杂度为O(n^1/2)处理,刚开始觉得不会超,复杂度为O(n),结果超时了几组数据,诶,还是很菜啊,得加油!下面给出AC代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5    int T;
 6    while(scanf("%d",&T)!=EOF)
 7    {
 8        int flag=0;
 9        for(int i=0;i<=sqrt(T+0.5);i++)
10        {
11            int j=sqrt(T-i*i);
12            if(pow(i,2)+pow(j,2)==T&&i<=j)
13            {
14                    flag=1;
15                    printf("%d %d\n",i,j);
16            }
17        }
18        if(!flag)
19         printf("No Solution\n");
20    }
21    return 0;
22 }
时间: 2024-10-06 10:03:29

51Nod 1080 两个数的平方和(数论,经典题)的相关文章

51Nod 1080 两个数的平方和

给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果有多种表示,按照i的递增序输出. 例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2 (注:3 11同11 3算1种) Input 一个数N(1 <= N <= 10^9) Output 共K行:每行2个数,i j,表示N = i^2 + j^2(0 <= i <= j). 如果无法分解为2个数的平方和,则输出No Solution Input示例 130 Output示例 3 

51 nod 1080 两个数的平方和

1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 取消关注 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果有多种表示,按照i的递增序输出. 例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2 (注:3 11同11 3算1种) Input 一个数N(1 <= N <= 10^9) Output 共K行:每行2个数,i j,表示N = i^2 + j^2(0 <= 

1080 两个数的平方和

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果有多种表示,按照i的递增序输出. 例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2 (注:3 11同11 3算1种) Input 一个数N(1 <= N <= 10^9) Output 共K行:每行2个数,i j,表示N = i^2 + j^2(0 <= i <= j). 如果无法分解为2个数的平

51Nod 1684 子集价值 (平方和去括号技巧)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684 题意: 新建一个位运算,求所有子集通过这个位运算后的答案的平方和是多少. 先想弱化版: 新建一个位运算,求所有子集通过这个位运算后的答案的和是多少. 枚举每一个二进制位,看有多少个子集能够使这一位为1 dp[i]表示前i个数中,能使枚举的这一位为1的方案数 根据第i个数选或者是不选转移 ans= Σ  2^j * 第j位的dp[n] 这里是平方和 设一个子集位运算

51nod 1090 3个数和为0 &amp; 51nod 1267 4个数和为0(标记二分)

题目意思: 3个数的和为0: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 -

有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数

有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数 描述:有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数.1.位图的方法:假设待处理数组为A[10w-2]定义一个数组B[10w],这里假设B中每个元素占用1比特,并初始化为全0for(i=0;i <10w-2;i++){ B[ A[i] ]=1}那么B中为零的元素即为缺少的数据这种方法的效率非常高,是计算机中最常用的算法之一2.首先计算1到10w的和,平方和. 然后计算给定数字的和,平方和. 两次的到的数字相减,可以得

如何不使用第三个变量来交换两个数的值

最近在看<c++从入门到精通>自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记. 题目:a=10,b=15,将a / b的值互换. 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下:      int a,b;      a=10; b=15;      int t;      t=a; a=b; b=t;      这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用

sdut 1-2 输出N个数的平方和立方值 (制表符“\t”的使用)

1-2 输出N个数的平方和立方值 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握C++的输入.输出方法 利用VC++开发环境,创建一个控制台应用程序,利用cin.cout语句使得程序能够根据输入的整数值,输出相应的平方和立方值 输入 一个整数 输出 由两部分组成,第一部分占一行,输出表头"NumberSquareCube":注意每一项占一个制表符的宽度(使用"\t"控制,每行末尾也有"\t

如何不运用第三方变量实现两个数的交换

当遇到交换两个变量的时候,我们通常使用的是借助第三方变量实现两个数的交换.那么如果不使用第三方变量时,该怎么操作呢. 下面有两种方法: 1.通过已有的两个变量之间的加或减实现: 这种方法对于两个都是无限接进int取值范围,而相加超出int取值范围的情况不适用. 2.通过异或实现(异或符号为^) ******************************************************************************************************