hdu5656

来源:互联网 发布:正规医院有男科吗 知乎 编辑:程序博客网 时间:2024/06/05 16:44

求组数的所有不重复子集的最大公约数之和



#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;
}


0 0
原创粉丝点击