HDU 5656 CA Loves GCD 枚举GCD+容斥

来源:互联网 发布:vb 字符串 校验码 编辑:程序博客网 时间:2024/05/18 23:28

题意:给你一个数目为n的集合,求这个集合所有非空子集的最大公约数。

思路:题目给的数据范围为1到1000,那么这个集合的非空子集的最大公约数必然不超过1000,并且也不超过这个集合的最大值。

那么从最大值枚举到1,然后进行容斥即可。

AC代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1010;ll power[maxn],cnt[maxn],f[maxn];const ll mod=1e8+7;int main(int argc, char const *argv[]){power[0]=1;for(int i=1;i<maxn;i++){power[i]=(power[i-1]*2)%mod;}cin.sync_with_stdio(false);int T;cin>>T;while(T--){int n,Max=0;cin>>n;memset(cnt,0,sizeof(cnt));memset(f,0,sizeof(f));for(int i=0,x;i<n;i++){cin>>x;cnt[x]++;Max=max(Max,x);}ll ans=0;for(int i=Max;i>=1;i--){int t=0;for(int j=i;j<=Max;j+=i){t+=cnt[j];}if(t){f[i]=(power[t]-1+mod)%mod;for(int j=i+i;j<maxn;j+=i){f[i]=(f[i]-f[j]+mod)%mod;}ans=(ans+1LL*i*f[i]%mod+mod)%mod;}}cout<<ans<<endl;}return 0;}