#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define clr(a) memset(a,0,sizeof(a)); const int maxsize=1000007,inf=0x7fffffff; template void show(T a[],int n){ for(int i=0;i void show(const vector& t){ for(int i=0;i class hashmap{ struct hashnode{ Tk key; Tv value; hashnode *next; }; hashnode mem[hashsize]; int mem_end; hashnode *entry[hashsize]; hashnode* getmem(){mem_end++; return mem+mem_end-1;} int culhash(const state& a){ int h =0; for(int i=0;inext){ if(p->key==k){ v=p->value; return true; } } return false; } bool insert(const Tk& key,const Tv& v){ if(mem_end>=hashsize)return false; int h=culhash(key); hashnode *p=getmem(); p->key=key;p->value=v;p->next=entry[h]; entry[h]=p; return true; } }; hashmap hhh; int maxstate; node get(state s){ sort(s.s,s.s+s.cnt); state os =s; node ret ; if(!hhh.get(s,ret)){ if(s.cnt==1&&isprime[s.s[0]]){ s.s[0]--; ret =get(s); swap(ret.a,ret.b); ret.a++; }else{ int i,j,k=0,l; for(i=0;iret.a){ ret=tmp; } } } } } if(k%2) swap(ret.a,ret.b); } ret.a+=k/2+k%2; ret.b+=k/2; } hhh.insert(os,ret); } return ret; } void test(int n){ clock_t t0=clock(); for(int i=2;i>n;n;--n){ scanf("%d",s.s); s.cnt=1; ans =get(s); printf("%d %d\n",ans.a,ans.b); } return 0; }