// checker.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include using namespace std; #include #include class number{ int up; int down; public: number(int u,int d):up(u),down(d){} number(const number& n):up(n.up),down(n.down){} number(int n=0):up(n),down(1){} number& operator+=(const number& n); number& operator-=(const number& n); number& operator*=(const number& n); number& operator/=(const number& n); bool is_zero()const{return down!=0&&up==0;} bool is_valid()const{return down!=0;} bool is_one()const{return down!=0&&up==down;} bool operator==(const number& n)const{return is_valid()&&n.is_valid()&&n.down*(long long)up==n.up*(long long)down;} bool operator<(const number& n)const; bool operator>(const number& n)const{return n<*this;} bool operator<=(const number& n)const{return !(*this>n);} bool operator!=(const number& n)const{return !(n==*this);} bool operator>=(const number& n)const{return !(*this(const lnumber& n)const{return n<*this;} bool operator<=(const lnumber& n)const{return !(*this>n);} bool operator!=(const lnumber& n)const{return !(n==*this);} bool operator>=(const lnumber& n)const{return !(*this>32)&M32; low1=in1&M32; high2=(in2>>32)&M32; low2=in2&M32; unsigned long long r1,r2,r3,r4; r1=low1*low2; r2=low1*high2; r3=high1*low2; r4=high1*high2; out[0]=(unsigned)(r1&M32); unsigned long long u=(r1>>32)&M32; u+=(r2&M32)+(r3&M32); out[1]=(unsigned)(u&M32); u=u>>32; u+=(r2>>32)+(r3>>32); u+=r4&M32; out[2]=(unsigned)(u&M32); u=u>>32; u+=(r4>>32); out[3]=(unsigned)u; } bool lnumber::operator <(const lnumber &n)const { unsigned int r1[4],r2[4]; int i; mult128(r1,up,n.down); mult128(r2,n.up,down); for(i=3;i>=0;i--){ if(r1[i]r2[i]) return false; } } #define DATA_PATH "..\\..\\unr2\\unr2\\data\" #define FILT_PATH "..\\..\\unr2\\unr2\\idata\" #define T 38103 int bc(int x){ int c=0; while(x>0){ if(x&1)c++; x>>=1; } return c; } #define BUFF_LEN 4096 #define MAX_BUFF_SIZE (40*1024*1024) number buff[BUFF_LEN]; number buff2[MAX_BUFF_SIZE]; bool test(number buff2[],int zu, const lnumber& r) { lnumber rr=r;rr.normalize(); if(rr.get_up()>0x7FFFFFFF||rr.get_down()>0x7FFFFFFF) return false; number sr((int)rr.get_up(),(int)rr.get_down()); return binary_search(buff2,buff2+zu,sr); } ///x is small set, y is large set bool verify(int x[],int xc, int y[],int yc, const lnumber& result) { int mask1,mask2; char f1Name[100],f2Name[100]; int i; mask1=mask2=0; for(i=0;i2){ f1=fopen(f1Name,"rb"); if(f1==NULL){ fprintf(stderr,"Cannot open file %s\n",f1Name); exit(-1); } yu=fread(buff,sizeof(number),BUFF_LEN,f1); }else{ if(xc==1){ yu=1; buff[0]=x[0]; }else{ yu=5; buff[0]=x[0]+x[1]; buff[1]=abs(x[0]-x[1]); buff[2]=x[0]*x[1]; buff[3]=number(x[0])/x[1]; buff[4]=number(x[1])/x[0]; } } f2=fopen(f2Name,"rb"); if(f2==NULL){ fprintf(stderr,"Cannot open file %s\n",f2Name); exit(-1); } zu=fread(buff2,sizeof(number),MAX_BUFF_SIZE,f2); fclose(f2); do{ for(i=0;i=0x7FFFFFFF||result.get_down()>=0x7FFFFFFF) return false; number sr((int)result.get_up(),(int)result.get_down()); int mask; char fName[100]; int i; mask=0; for(i=0;i2){ f=fopen(fName,"rb"); if(f==NULL){ fprintf(stderr,"Cannot open file %s\n",fName); exit(-1); } yu=fread(buff,sizeof(number),BUFF_LEN,f); }else{ if(c==1){ yu=1; buff[0]=x[0]; }else{ yu=5; buff[0]=x[0]+x[1]; buff[1]=abs(x[0]-x[1]); buff[2]=x[0]*x[1]; buff[3]=number(x[0])/x[1]; buff[4]=number(x[1])/x[0]; } } do{ for(i=0;i=size){ int c; for(j=0,c=0;j<9;j++){ if(i&(1<=size){ int c; for(j=0,c=0;j<10;j++){ if(i&(1<=size){ int c; for(j=0,c=0;j<11;j++){ if(i&(1<