题目链接:http://poj.org/problem?id=1777
题意:给出n个数Ai,给每个数字加上一个指数ei(0<=e1<=10),使得:
思路:(1)梅森素数:2^i-1的素数叫做梅森素数;
(2)“一个数能够写成几个不重复的梅森素数的乘积” 等价于 “这个数的约数和是2的幂次”。
由于题目给的数据范围内的梅森素数只有8个,可以状态压缩。
int mason[8]={3,7,31,127,8191,131071,524287,2147483647};
int mp[8]={2,3,5,7,13,17,19,31};
vector<int> V;
int n,f[1<<10];
int ok(int t)
{
int ans=0,i;
FOR0(i,8) if(t%mason[i]==0)
{
ans|=(1<<i);
t/=mason[i];
if(t%mason[i]==0) return 0;
}
if(t!=1) return 0;
return ans;
}
int cal(int t)
{
int cnt=0,i;
FOR0(i,8) if(t&(1<<i)) cnt+=mp[i];
return cnt;
}
int main()
{
Rush(n)
{
V.clear();
int i,x;
FOR0(i,n)
{
RD(x);
if(x=ok(x)) V.pb(x);
}
n=SZ(V);
if(!n)
{
puts("NO");
continue;
}
clr(f,0);
f[0]=1;
int j;
FOR0(i,(1<<8)) if(f[i]) FOR0(j,n) if(!(i&V[j]))
{
f[i|V[j]]=1;
}
int ans=0;
FOR0(i,(1<<8)) if(f[i]) upMax(ans,cal(i));
PR(ans);
}
}