CA Loves GCD

Accepts: 135
Submissions: 586
Time Limit: 6000/3000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
问题描述
CA喜欢是一个热爱党和人民的优秀同♂志,所以他也非常喜欢GCD(请在输入法中输入GCD得到CA喜欢GCD的原因)。
现在他有N个不同的数,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去。
为了使自己不会无聊,CA会把每种不同的选法都选一遍,CA想知道他得到的所有GCD的和是多少。
我们认为两种选法不同,当且仅当有一个数在其中一种选法中被选中了,而在另外一种选法中没有被选中。
输入描述
第一行 T,表示有 T 组数据。
接下来 T 组数据,每组数据第一行一个整数 N,表示CA的数的个数,接下来一行 N 个整数 Ai​i​​ 表示CA的每个数。
1≤T≤50, 1≤N≤1000, 1≤Ai≤10001 \le T \le 50,~1 \le N \le 1000,~1 \le A_i \le 10001≤T≤50, 1≤N≤1000, 1≤A​i​​≤1000
输出描述
对于每组数据输出一行一个整数表示CA所有的选法的GCD的和对 100000007 取模的结果。
输入样例
2
2
2 4
3
1 2 3
输出样例
8
10 所有数据∈[1,1000]
  这次的BestCoder没打,从没见过这么难的第二题。
  我们令dp[i][j]表示在前i个数中,选出若干个数使得它们的gcd为j的方案数,于是只需要枚举第i+1个数是否被选中来转移就可以了。
  令第i+1个数为v,当考虑dp[i][j]的时候,我们令dp[i+1][j] += dp[i][j],dp[i+1][gcd(j,v)] += dp[i][j]
  复杂度O(N*MaxV) MaxV 为出现过的数的最大值。
  其实有O(MaxV *log(MaxV))的做法,我们考虑记f[i]表示从这些数中选择若干个数,使得他们的gcd是i的倍数的方案数。假如有K个数是i的倍数,则f[i]=2K-1,再用g[i]表示从这些数中选择若干个数,使得他们的gcd是i的方案数,则g[i]=f[i] - Σ(j是i的倍数)g[j] 。
  由调和级数可以得到复杂度为O(MaxV *log(MaxV))
  
  还是挺巧妙的!
TLE的DP(MB卡常数):
 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
const int mod=;
int dp[maxn][maxn],a[maxn];
int Gcd(int a,int b){
return b?Gcd(b,a%b):a;
}
int main(){
int T,n,maxv;
scanf("%d",&T);
while(T--){
memset(dp,,sizeof(dp));
scanf("%d",&n);maxv=;
for(int i=;i<=n;maxv=max(maxv,a[i]),i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)dp[i][]=;
for(int i=;i<=n;i++){
for(int j=;j<=maxv;j++)dp[i][j]=dp[i-][j];
for(int j=;j<=maxv;j++)
(dp[i][Gcd(j,a[i])]+=dp[i-][j])%=mod;
}
int ans=;
for(int j=;j<=maxv;j++)
(ans+=dp[n][j]*j)%=mod;
printf("%d\n",ans);
}
return ;
}

第二种方法的AC程序:

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
const int mod=;
long long f[maxn],g[maxn],ans;
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(f,,sizeof(f));
for(int i=,x;i<=n;i++){
scanf("%d",&x);
for(int j=;j<=x;j++){
if(x%j==)
f[j]++;
}
}
for(int i=;i<=;i++){
long long ret=;
for(int j=;j<=f[i];j++)
(ret*=)%=mod;
ret-=;
f[i]=ret;
}
for(int i=;i>=;i--){
g[i]=f[i];
for(int j=*i;j<=;j+=i)
(g[i]-=g[j])%=mod;
}
ans=;
for(int i=;i<=;i++)
(ans+=g[i]*i)%=mod;
printf("%lld\n",(ans+mod)%mod);
}
return ;
}

数学(GCD,计数原理)HDU 5656 CA Loves GCD的更多相关文章

  1. hdu 5656 CA Loves GCD(n个任选k个的最大公约数和)

    CA Loves GCD  Accepts: 64  Submissions: 535  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: 2 ...

  2. HDU 5656 CA Loves GCD 01背包+gcd

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5656 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  3. HDU 5656 CA Loves GCD dp

    CA Loves GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 Description CA is a fine comrade w ...

  4. HDU 5656 CA Loves GCD (数论DP)

    CA Loves GCD 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/B Description CA is a fine c ...

  5. HDU 5656 ——CA Loves GCD——————【dp】

    CA Loves GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  6. hdu 5656 CA Loves GCD

    CA Loves GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  7. hdu 5656 CA Loves GCD(dp)

    题目的意思就是: n个数,求n个数所有子集的最大公约数之和. 第一种方法: 枚举子集,求每一种子集的gcd之和,n=1000,复杂度O(2^n). 谁去用? 所以只能优化! 题目中有很重要的一句话! ...

  8. HDU 5656 CA Loves GCD (容斥)

    题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ...

  9. CA Loves GCD (BC#78 1002) (hdu 5656)

    CA Loves GCD  Accepts: 135  Submissions: 586  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: ...

随机推荐

  1. Python开发【第十三篇】:jQuery(二)

    http://www.bubuko.com/infodetail-1438296.html 处理完毕需要整理贴进来 Python之路[第十三篇]jQuery案例-Form表单&插件及扩展   ...

  2. day-10

    /* 还是习惯在插入里面写东西 233 今晚停电了 一屋人唱歌讲鬼故事 挺开心的 还有不到十天大家就要分开了 还记得第一次来机房的时候 大家都还不认识 到现在快一年了 大家可以一起闹一起笑 一起没心没 ...

  3. css(动画,过渡,转换)

    css3动画 @keyframes 规定动画,必须定义动画的名称,动画时长的百分比,一个或多个css样式属性 以百分比来规定改变发生的时间,或者通过关键词"from"和" ...

  4. 传统的log4j实战

    /** * */ package log4j; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator ...

  5. 测测你适合从事Web前端开发吗

    一般初创的互联网公司最烧钱的时候往往都是刚刚获得风投或融资的时候,因为他们要把钱砸向前端,因为那时候没有客户访问,对于企业来说只有先做好前端技 术.做好客户体验一切才有可能.用户体验做好,才有人访问, ...

  6. angularjs-ngModel传值问题

    js NiDialog.open({ windowClass: '', backdrop: 'static', keyboard: false, templateUrl: '/static/tpl/a ...

  7. openwrt advanced configuration

    openwrt高级配置(汗 照着标题就翻译过来了) openwrt Kamikaze 8.09的一般配置文件都在目录 /etc/config 下面,可以使用脚本来调用参数和设置参数. 比如 sbin/ ...

  8. IOS学习--UILable使用手册(20150120)

    第一步:创建一个UILable对象 UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; 第二步:设置对象的各种属性 ...

  9. OC - 28.模拟时钟

    效果图 实现思路 该示例通过隐式动画实现 表盘通过显示在imageView中的一张图片来实现 在表盘上绘制(时分秒)三条直线,分别位于不同的图层,且时针位于最下层,秒针位于最上层 设置直线为圆角 直线 ...

  10. 第一次用Github desktop(mac)提交代码遇到的问题

    1.新建代码仓库 2.生成密钥 ssh-keygen -C 'your@email.address' -t rsa 3.到根目录下的.ssh文件夹下找到id_rsa.pub文件,将里面的内容复制到下图 ...