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. PL/SQL 触发器简介

    与公司同事交流了一下,得知触发器很少用.性能是一方面,主要是如果用太多触发器,可能到时你都不知道会有什么操作自动发生. 有些操作可以在程序中控制.例如在插入某个表时,写个log表的记录.这可以用触发器 ...

  2. HTML - 键盘事件

    Keyboard 事件 onkeydown: 在用户按下按键时触发. onkeypress: 在用户敲击按钮时触发. onkeyup: 当用户释放按键时触发. 示例 <!DOCTYPE html ...

  3. MEF依赖注入调试小技巧!

    自从哥的项目使用MEF以来,天天那个纠结啊,甭提了.稍有错误,MEF就报错,但就不告诉你哪错了,大爷的. 后来看了MEFX的相关调试方法,感觉也不太理想,根本不够直观的看到错误原因,也许是没有深入学习 ...

  4. acl操作记录

    官方文档内容: 1.CREATE_ACL Procedure创建ACL Note: This procedure is deprecated in Oracle Database 12c. While ...

  5. Core Data 教学

    看了一篇国外的文章,关于iOS9的Core Data教学,在这里做了一下总结 Core Data 教学 示例开源地址:LastDayCoreData 在这篇文章中我们将学习Core Data的系列教程 ...

  6. css 不确定元素宽度的水平居中

    对于一个不确定宽度的元素居中,我们想到使用的方法是 text-align:center; 或者 margin:0 auto; text-align只对行内元素有效,对于块元素我们要用margin,块元 ...

  7. javascript的选项卡

    主要用的索引值 首先 写三个按钮 <input type="button" > <input type="button" > <i ...

  8. POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

    #include <cstdio> #include <cstring> #include <algorithm> const int inf=0x3f3f3f3f ...

  9. Excel等外部程序点击链接会带上IE信息的bug

    今天碰到一个问题,在Excel内点击链接到默认浏览器Chrome打开,奇怪的是服务端收到的Session一直对不上. 查了很久发现这个Excel到Chrome的跳转竟然带上了IE的Cookie 和 U ...

  10. DEDE更改版权信息

    DEDECMSV5.7版本出现后,在前台网页底部会出现织梦版权信息 “powered by  dedecms”,很多人都不知道怎么去掉 1. 方法一: 在include/dedesql.classs. ...