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

简单的数学问题 开始无脑暴力T了一发,如图:

喵喵喵???只卡我一组数据???吓得我赶紧花了五个点头盾去写了个特判...

呸!你ACMer的脸还要不要了!!

我们可以设t^2=n,那么由此我们可以看出i和j一定是不大于t的,所以我们遍历到sqrt(n)即可,

当然,我们也不能无脑遍历,当我们知道i时便可由j^2=(n-i^2)来求得j,此外,i也不会大于j.

附AC代码:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4
 5 int main(){
 6     int n;
 7     cin>>n;
 8     int ans=0;
 9     int t=sqrt(n);
10     for(int i=0;i<=t;i++){
11         int j=sqrt(n-i*i);
12         if(j*j+i*i==n&&j>=i){
13             ans++;
14             cout<<i<<" "<<j<<endl;
15         }
16     }
17     if(ans==0)
18     cout<<"No Solution"<<endl;
19     return 0;
20 }
时间: 2024-12-06 08:07:19

1080 两个数的平方和的相关文章

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).

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 <= 

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 

有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的和,平方和. 然后计算给定数字的和,平方和. 两次的到的数字相减,可以得

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.通过异或实现(异或符号为^) ******************************************************************************************************

20150328晚,不使用乘号运算符实现两个数相乘

//20150328晚,不使用乘号运算符实现两个数相乘 #include <stdio.h> #include <stdlib.h> #pragma warning(disable:4996) //using namespace std; int main() { int m, n, t; long long ll, absn, absm; while (scanf("%d %d", &m, &n) != EOF) { absn = n; abs

笔试算法题(09):查找指定和值的两个数 &amp; 构造BST镜像树

出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{-i-j-k-m--},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况: 解题: 1 void FindSumFactor(int *array, int length, int sum) { 2 int left=0, right=length-1; 3 whil

请编写一个程序,该程序可以接收两个数,并判断两个数是大于、小于、等于?

//作者:janushu //日期:2017/9/20 //功能判断两个数的大小 import java.io.*; public class CompareToNumDemo{ public static void main(String[] args){ try{ //输入流 从键盘上输入一个数 InputStreamReader isr = new InputStreamReader(System.in); //缓存读取一个数 BufferedReader br = new Buffere