Moderator: Board moderators

I want to request the judge to reduce it's input so that more people can solve it in different method, (not only in the way that the problem setter have
/* a = input number */
for (l = 0, u = a; l < u;) {
x = (l + u) >> 1;
/* break, if the following check can't be done in O(1) */
if (x * x > a) u = x; else l = x;
}
for (x = u;; x = y)
if ((y = (x + a / x) >> 1) >= x) break;
/* now x = root */
mf wrote:Here's how my algorithm looks:
- Code: Select all
/* a = input number */
for (l = 0, u = a; l < u;) {
x = (l + u) >> 1;
/* break, if the following check can't be done in O(1) */
if (x * x > a) u = x; else l = x;
}
for (x = u;; x = y)
if ((y = (x + a / x) >> 1) >= x) break;
/* now x = root */
Excuse me, but how on earth that the check be done in O(1) is possible?
mf wrote:First, I use binary search to get a good approximation of the root (within a factor of 2 of its real value.)
And then just Newton's method. Of course, it needs long division, but the good thing is that starting with a good approximation you'll need quite a few of them, for example, to compute sqrt(123^450) my program needs only 8 divisions.
Binary search needs just addition and shifts.
Here's how my algorithm looks:
- Code: Select all
/* a = input number */
for (l = 0, u = a; l < u;) {
x = (l + u) >> 1;
/* break, if the following check can't be done in O(1) */
if (x * x > a) u = x; else l = x;
}
for (x = u;; x = y)
if ((y = (x + a / x) >> 1) >= x) break;
/* now x = root */
for (l = 0, u = a; ;) {
x = (l + u) /2;
/* break, if the following check can't be done in O(1) */
if (x.length/2 > a.length) u = x;
else break;
}
for (x = u;; x = y)
if ((y = (x + a / x)/2) >= x) break;
return x;

medv wrote:Why Complie Error?
medv wrote:Can I use classes on UVA?
#include <cstdio>
#include <vector>
#include <list>
using namespace std;
vector <char>v;
vector <char>s;
vector <char>result;
int BigInterger_Large(vector <char> & v1,vector <char> & v2)
{
int len,i;
if(v1.size()>v2.size())
return 1;
if(v2.size()>v1.size())
return 0;
len=v1.size();
for(i=len-1;i>=0;i--)
if(v1[i]<v2[i])
return 0;
else if(v1[i]==v2[i])
;
else
return 1;
return 2;
}
int BigInterger_DIV(vector <char> & v1,int mod,vector <char> & v2)
{
int len,i,flag;
int sum;
list <char>hold;
hold.clear();
v2.clear();
len=v1.size();
flag=sum=0;
for(i=len-1;i>=0;i--)
{
sum+=v1[i];
if(sum<mod)
{
if(flag)
hold.push_back(0);
}
else
{
flag=1;
hold.push_back(sum/mod);
sum=sum%mod;
}
if(i>0)
sum=sum*10;
}
if(hold.size()==0)
v2.push_back(0);
while(hold.size())
{
v2.push_back(hold.back());
hold.pop_back();
}
return sum;
}
void BigInterger_MUL(vector <char> & v1,vector <char> & v2,vector <char> & v3)
{
int len,i,a,b,j,s;
int carry=0;
v3.clear();
len=v1.size()-1+v2.size()-1;
if(v1.size()==1&&v1[0]==0)
v3.push_back(0);
else if(v2.size()==1&&v2[0]==0)
v3.push_back(0);
else
for(i=0;i<=len;i++)
{
for(j=0;j<=i;j++)
{
s=i-j;
(v1.size()<=j)?a=0:a=v1[j];
(v2.size()<=s)?b=0:b=v2[s];
carry+=(a*b);
}
if(carry>=10)
{
v3.push_back(carry%10);
carry=carry/10;
}else{
v3.push_back(carry);
carry=0;
}
}
if(carry)
v3.push_back(carry);
}
void BigInterger_ADD(vector <char> & v1,vector <char> & v2,vector <char> & v3)
{
int len,i,a,b;
int carry=0;
v3.clear();
(v1.size()>=v2.size())?len=v1.size():len=v2.size();
for(i=0;i<len;i++)
{
(v1.size()<=i)?a=0:a=v1[i];
(v2.size()<=i)?b=0:b=v2[i];
if(a+b+carry>=10)
{
v3.push_back( (a+b+carry)%10 );
carry=(a+b+carry)/10;
}else{
v3.push_back(a+b+carry);
carry=(a+b+carry)/10;
}
}
if(carry)
v3.push_back(carry);
}
//OK!...
int input(vector <char> & v1)
{
int i=0,len;
int dis;
char sen[100000];
v1.clear();
dis=scanf("%s",sen);
if(dis==-1)
return 0;
len=strlen(sen);
for(i=len-1;i>=0;i--)
v1.push_back(sen[i]-'0');
return 1;
}
void print(vector <char> & v1)
{
int i=0;
for(i=v1.size()-1;i>=0;i--)
printf("%d",v1[i]);
printf("\n");
}
void copyVector(vector <char> & v1,vector <char> & v2)
{
int i;
v2.clear();
for(i=0;i<v1.size();i++)
v2.push_back(v1[i]);
}
void BigInterger_SQRT(vector <char> & b,vector <char> & c)
{
vector <char> a;
vector <char> t;
vector <char> r1;
vector <char> r2;
c.clear();
copyVector(b,r2);
a.push_back(0);
while( BigInterger_Large(r2,a) ) //r2>a
{
BigInterger_ADD(a,r2,r1); //(r1=a+b);
BigInterger_DIV(r1,2,t); //t=(a+b)/2;
BigInterger_MUL(t,t,r1); //r1=t*t;
if( BigInterger_Large(a,t)==2)
break;
if( BigInterger_Large(r1,b) )
copyVector(t,r2);
else
copyVector(t,a);
//print(r2);
// print(a);
}
copyVector(r2,c);
}
int main()
{
int num,i;
scanf("%d",&num);
for(i=0;i<num;i++)
{
input(s);
BigInterger_SQRT(s,result);
print(result);
printf("\n");
}
return 0;
}Users browsing this forum: No registered users and 1 guest