一个规律题 一开始还傻*的二分。。。诶。。。不过值得注意的是,sqrt的返回值,10e15不小心是会变成负的。
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; ll ans; int T,cas=1,x,y; int main() { // for (long long i=1; i<MAXN; i++) a[i]=i*i; scanf ("%d",&T); while (T--) { ll n; scanf ("%lld",&n); if ((ll)sqrt(n*1.0)*sqrt(n*1.0)==n) { if (n%2==0) { printf ("Case %d: ",cas++); printf ("%.0f %d\n",sqrt(n*1.0),1); } else { printf ("Case %d: ",cas++); printf ("%d %.0f\n",1,sqrt(n*1.0)); } } else { int pos=(int)sqrt(n); // int pos=lower_bound(a,a+32000000,n)-a; // printf ("pos=%d,a[pos]=%lld\n",pos,a[pos]); if (pos%2==0) { x=pos+1; y=1; long long temp=n-(long long)pos*pos-1; if (temp<=pos) y+=temp; else {y+=pos;x-=(temp-pos);} } else { x=1; y=pos+1; long long temp=n-(long long)pos*pos-1; if (temp<=pos) x+=temp; else {x+=pos;y-=(temp-pos);} } printf ("Case %d: %d %d\n",cas++,x,y); } } return 0; }