51 nod 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 11
7 9																																		
思路:先将从1到100000把每个数的平方存在数组中,之后枚举1-sqrt(n),在数组中二分查找,set判重
#include<bits/stdc++.h>
typedef long long ll;
const ll mod = 1e9+7;
using namespace std;
ll n,a[100000+10],pos;
set<ll> s;
ll check(ll nn){
   // cout<<nn<<endl;
    ll l=0,r=pos;
    while(l<=r){
        ll mid = (r+l)/2;
        if(a[mid]==nn){
            return mid;
        }
        if(a[mid]<=nn){
            l=mid+1;
        }
        else{
            r=mid-1;
        }
       // cout<<a[mid]<<" "<<l<<" "<<r<<endl;
    }
    return 0;
}
main()
{
    memset(a,0,sizeof(a));
    for(ll i=0;i<=100000;i++){
        a[i]=i*i;


        if(a[i]>=mod){
             pos = i;
            break;
        }
    }
    while(~scanf("%lld",&n)){
        ll ans  = 0;
        while(1){
            //cout<<n-a[ans]<<endl;
            if(check(n-a[ans])&&!s.count(ans)){
                cout<<ans<<" "<<sqrt(n-a[ans])<<endl;
                s.insert(ans);
                s.insert(sqrt(n-a[ans]));
            }
            ans++;
            if(ans*ans>n){
                break;
            }
        }
        if(s.empty()){
            cout<<"No Solution"<<endl;
        }
        s.clear();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值