51nod 1080 两个数的平方和【二分+预处理】

来源:互联网 发布:php默认编码方式 编辑:程序博客网 时间:2024/06/01 15:24

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 117 9

思路:


我们预处理出100000内所有的平方数,那么接下来我们枚举一个i,然后二分查找合法的位子j即可。

时间复杂度O(nlongn),这里n=100000


Ac代码:

#include<stdio.h>#include<string.h>using namespace std;#define ll __int64ll ans[100006];void init(){    for(int i=0;i<=100000;i++)    {        ans[i]=(ll)i*(ll)i;    }}int main(){    ll n;    init();    while(~scanf("%I64d",&n))    {        int flag=0;        for(int i=0;i<=100000;i++)        {            int l=i,r=100000;            while(r-l>=0)            {                int mid=(l+r)/2;                if(ans[mid]+ans[i]>n)                {                    r=mid-1;                }                else if(ans[mid]+ans[i]<n)                {                    l=mid+1;                }                else                {                    flag=1;                    printf("%d %d\n",i,mid);break;                }            }        }        if(flag==0)        {            printf("No Solution\n");        }    }}




0 0
原创粉丝点击