题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5656

bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=683&pid=1002

CA Loves GCD

Accepts: 64    Submissions: 535

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

问题描述

CA喜欢是一个热爱党和人民的优秀同♂志,所以他也非常喜欢GCD(请在输入法中输入GCD得到CA喜欢GCD的原因)。

现在他有N个不同的数,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去。

为了使自己不会无聊,CA会把每种不同的选法都选一遍,CA想知道他得到的所有GCD的和是多少。

我们认为两种选法不同,当且仅当有一个数在其中一种选法中被选中了,而在另外一种选法中没有被选中。

输入描述

第一行TT,表示有TT组数据。

接下来TT组数据,每组数据第一行一个整数NN,表示CA的数的个数,接下来一行NN个整数A_iAi​​表示CA的每个数。

1 \le T \le 50,~1 \le N \le 1000,~1 \le A_i \le 10001≤T≤50, 1≤N≤1000, 1≤Ai​​≤1000

输出描述

对于每组数据输出一行一个整数表示CA所有的选法的GCD的和对100000007100000007取模的结果。

输入样例

2

2

2 4

3

1 2 3

输出样例

8

10

题解:

  可以建模为01背包的模型。

  dp[i][j]表示前i个数的任意组合中gcd等于j的组合数。

  转移方程有:(刷表法)

    第i个数不取:dp[i][j]+=dp[i-1][j];

    第i个数要取:dp[i][gcd(a[i],j)]+=dp[i-1][j];

  可以离线处理出1000以内任意两个数的gcd值,否则会超时,当然也可以通过减枝来降低时间复杂度(如果dp[i-1][j]=0,就没必要算gcd(a[i],j)了)。

  初始化有dp[0][0]=1(一个数都没有,则有gcd为0)

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; typedef long long LL;
const int maxn = + ;
const int mod = 1e8 + ;//这里不要写成1e9+7!!!! int n;
int a[maxn], dp[maxn][maxn];
int g[maxn][maxn]; int gcd(int a, int b) {
return b == ? a : gcd(b, a%b);
} void get_g() {
for (int i = ; i <= ; i++) {
for (int j = i; j <= ; j++) {
g[i][j] = g[j][i] = gcd(i, j);
}
}
} void init() {
memset(dp, , sizeof(dp));
} int main() {
get_g();
int tc;
scanf("%d", &tc);
while (tc--) {
init();
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", a + i);
}
dp[][] = ;
for (int i = ; i <= n; i++) {
for (int j = ; j <= ; j++) {
dp[i][j] += dp[i - ][j]; dp[i][j] %= mod; int tmp = g[a[i]][j];
dp[i][tmp] += dp[i - ][j]; dp[i][tmp] %= mod;
}
}
LL ans = ;
for (int i = ; i <= ; i++) {
ans += (LL)dp[n][i] * i;
ans %= mod;
}
printf("%lld\n", ans);
}
return ;
}

HDU 5656 CA Loves GCD 01背包+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 dp

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

  3. 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 ...

  4. 数学(GCD,计数原理)HDU 5656 CA Loves GCD

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

  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. HDU 5655 CA Loves Stick 水题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 CA Loves Stick Accepts: 381   Submissions: 3204 ...

随机推荐

  1. Angular4 扫雷小游戏

    扫雷小游戏,可以升级过关,难度随关卡增加.但是有很明显的bug,以后有时间会继续优化! HTML: <div class="mainContent"> <div ...

  2. 撩妹技能 get,教你用 canvas 画一场流星雨

    开始 妹子都喜欢流星,如果她说不喜欢,那她一定是一个假妹子. 现在就一起来做一场流星雨,用程序员的野路子浪漫一下. 要画一场流星雨,首先,自然我们要会画一颗流星. 玩过 canvas 的同学,你画圆画 ...

  3. MongoDB DBA 实践3-----安装mongdb4.0发生错误

    在安装mongodb时,常常会出现一些错误,导致无法安装完全,下面则是各种错误与它们的解决方法: 1.在window机安装mongodb4.0, 其中的一种:由于缺失系统补丁,而导致无法完全安装,具体 ...

  4. 使用树莓派拍摄延时动画,制作GIF图

    本期教大家将编写一个小脚本用树莓派来捕获多个图像,然后可以将这些图像组合成动画GIF,使用延时摄影功能,可以在几秒钟内查看非常慢的事情. 我们需要用到ImageMagick,这是一个用于图像处理的命令 ...

  5. STM32利用CUBEMX建立自定义HID工程,并且完成64字节的IN,OUT传输功能。

    STM32 Customed HID开发流程 本文介绍的是STM32的cubeMX自定义HID的开发流程 cubeMX配置customed HID模式.更多详细配置壳查看代码CubeMX的配置文件. ...

  6. 《Nginx高性能Web服务器》系列分享专栏

    <Nginx高性能Web服务器>系列分享专栏 [作者:Poechant] Nginx是目前最流行的基于BSD-like协议.轻量级.高性能的HTTP服务器.反向代理服务器和电子邮件(SMT ...

  7. BZOJ 小Z的袜子 2038 国家集训队

    过程: 想了很久如何求组合数C(n,m),然而 YL 同学提醒了可以直接除以 2*n*(n - 1 ).改了之后果然对了,以为一定是一次性AC 了,然而 WA 了3次,尴尬 —— 神 TM,ZC 苟看 ...

  8. poj 2349 Arctic Network(prime)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25165   Accepted: 7751 Description The ...

  9. 20155234 2016-2017-2 《Java程序设计》第1 周学习总结

    20155234 2016-2017-2 <Java程序设计>第1 周学习总结 教材学习内容总结 第一周学习了第一章,第一章的内容等同于绪论,向我们介绍了jave的前世今生,以及三大平台. ...

  10. 20155301 2016-2017-2 《Java程序设计》第8周学习总结

    20155301 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 1.java.util.logging包提供了日志功能相关类与接口.使用日志的起点是logg ...