HDU 4342
View Code
1 #include<iostream> 2 #include<set> 3 #include<cstdio> 4 #include<cmath> 5 using namespace std; 6 typedef long long int ll; 7 set<ll> S; 8 9 void prepare() 10 { 11 ll end = ll(sqrt(double((1<<31) - 1))); 12 for (ll i(2); i<=end; ++i) { 13 S.insert(i*i); 14 } 15 end = (1<<31) - 1; 16 ++end; 17 //cout<<end<<endl; 18 S.insert(end); 19 } 20 21 int main() 22 { 23 int t; 24 prepare(); 25 scanf("%d",&t); 26 while (t--) { 27 ll n; 28 scanf("%I64d",&n); 29 if (n<3) { 30 cout<<n+1<<" "<<n+1<<endl; 31 continue; 32 } 33 ll ans1(0),cnt(3); 34 for (set<ll>::iterator i = S.begin(); i != S.end(); ++i) { 35 set<ll>::iterator j = i; 36 ++j; 37 if (cnt <= n && n <= cnt + (*j - *i - 2)) { 38 ans1 = n - cnt + 1 + *i; 39 break; 40 } else { 41 cnt += (*j - *i - 1); 42 } 43 } 44 45 ll ans2(3); 46 cnt = 2; 47 for (set<ll>::iterator i = S.begin(); i != S.end(); ++i) { 48 set<ll>::iterator j = i; 49 ++j; 50 if (*i <= ans1 && ans1 <= *j) { 51 ans2 += cnt*(ans1 - *i + 1); 52 break; 53 } else { 54 ans2 += cnt*(*j - *i); 55 ++cnt; 56 } 57 } 58 cout<<ans1<<" "<<ans2<<endl; 59 } 60 return 0; 61 }