hdu 4610 Cards (贪心+暴力)(二)
x,xx+16,cmp); // 按照得分排序 } bool issquare(ll pro) // 判断是否是平方数 { ll d=sqrt(pro*1.0); if((d-1)*(d-1)==pro||d*d==pro||(d+1)*(d+1)==pro) return true ; return false ; } void solve() { int i,j,t,flg,num,sum; ll pro=1; num=sum=0; for(i=1; i*i<=a; i++) // sqrt(a)枚举约数 { if(a%i==0) { pro*=i; if(i*i!=a) { num+=2; sum+=i+a/i; pro*=a/i; } else { num++; sum+=i; } if(pro==ll(a)*ll(a)) pro=1; // 注意这里的强制转换! } } if(!vis[a]) flg=1; else flg=0; state=sc=0; if(flg) sc++,state|=1; if(!vis[num]) sc++,state|=(1<<1); if(!vis[sum]) sc++,state|=(1<<2); if(issquare(pro)) sc++,state|=(1<<3); score[state]+=b; } int main() { int i,j,t; init(); scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(score,0,sizeof(score)); vector
v; for(i=1; i<=n; i++) { scanf("%d%d",&a,&b); solve(); v.push_back(sc); } for(i=0; i<4; i++) { scanf("%d",&s[i]); } tot=1<<16; ans=-INF; int res,k,ns; for(i=1;i
score[xx[j].s]-1) { k-=score[xx[j].s]-1; res+=(score[xx[j].s]-1)*xx[j].num; } else { res+=k*xx[j].num; k=0; break ; } } if(k==0) // 如果能够取k个 { for(j=0;j<4;j++) { if(!(ns&(1<