求组数的所有不重复子集的最大公约数之和
#include<cstdio>
#include<cstring>
using namespace std;
long long f[1010],g[1010];
long long ans=0;
int t,n,num[1010],a[1010];
long long quick_pow(int a,int x,int p)
{
long long sum=a,ans=1;
while (x>0)
{
if (x%2==1)
ans=ans*sum%p;
sum=sum*sum%p;
x=x/2;
}
return ans;
}
void init()
{
scanf("%d",&t);
}
void work()
{
while (t--)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(num,0,sizeof(num));
for (int i=1;i<=n;i++)
for (int j=1;j<=1000;j++)
if (a[i]%j==0)
num[j]++;
for (int i=1;i<=1000;i++)
f[i]=quick_pow(2,num[i],100000007)-1;
for (int i=1000;i>=1;i--)
{
g[i]=f[i];
for (int j=2;j*i<=1000;j++)
g[i]=(g[i]-g[j*i]+100000007)%100000007;
}
ans=0;
for (int i=1;i<=1000;i++)
ans=(ans+g[i]*i%100000007)%100000007;
printf("%I64d\n",ans);
}
}
int main()
{
init();
work();
return 0;
}