给出一个整数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(); } }