题目的意思就是: 
n个数,求n个数所有子集的最大公约数之和。

第一种方法: 
枚举子集,求每一种子集的gcd之和,n=1000,复杂度O(2^n)。 
谁去用?

所以只能优化! 
题目中有很重要的一句话!

We guarantee that all numbers in the test are in the range [1,1000].
  • 1
  • 1

这句话对解题有什么帮助? 
子集的种数有2^n种,但是,无论有多少种子集,它们的最大公约数一定在1-1000之间。 
所以,我们只需要统计1-1000的最大公约数中可以有多少中方法凑成就可以了!

我们就会考虑dp。 
官方题解:

我们令dp[i][j]表示在前i个数中,选出若干个数使得它们的gcd为j的方案数,于是只需要枚举第i+1个数是否被选中来转移就可以了。
令第i+1个数为v,当考虑dp[i][j]的时候,我们令$dp[i+][j] += dp[i][j],dp[i+][gcd(j,v)] += dp[i][j]。
复杂度O(N*MaxV) MaxV 为出现过的数的最大值。

AC 代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
#define N 1006
#define MOD 100000007
#define ll long long
ll n;
ll a[N];
ll dp[N][N],g[N][N];
ll gcd(ll x,ll y){
return y==?x:gcd(y,x%y);
}
void init(){
for(ll i=;i<=;i++){
for(ll j=i;j<=;j++){
g[i][j]=g[j][i]=gcd(i,j);
}
}
}
int main()
{
init();
ll t;
scanf("%I64d",&t);
while(t--){
scanf("%I64d",&n);
for(ll i=;i<n;i++){
scanf("%I64d",&a[i]);
}
memset(dp,,sizeof(dp)); for(ll i=;i<n;i++){
dp[i][a[i]]++;
for(ll j=;j<=;j++){
dp[i+][j]+=dp[i][j];
dp[i+][j]%=MOD; ll r=g[a[i+]][j];
dp[i+][r]+=dp[i][j];
dp[i+][r]%=MOD;
}
}
ll ans=;
for(ll i=;i<=;i++){
if(dp[n][i]!=){
ans+=i*dp[n][i];
ans%=MOD;
}
}
printf("%I64d\n",ans);
}
return ;
}

hdu 5656 CA Loves GCD(dp)的更多相关文章

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

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

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

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

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

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

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

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

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

  7. hdu 5656 CA Loves GCD

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

  8. HDU 5656 CA Loves GCD (容斥)

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

  9. HDU 5658 CA Loves Palindromic(回文树)

    CA Loves Palindromic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

随机推荐

  1. java_内存划分

    内存划分

  2. java java.uitl.Random产生随机数

    通过使用java.uitl.Random产生一个1-10内的随机数.例: Random random = new Random(); int i = Math.abs(random.nextInt() ...

  3. ajax提交写法

    <script> /* ajax提交写法 */ function add_prize() { // var query={}; var query = new Object(); quer ...

  4. C++简介

    本文仅用于学习交流,转载请注明:http://www.cnblogs.com/mxbs/p/6266466.html  Hello,C++ World! 简介: C++融合了3中不同的编程传统:C语言 ...

  5. 字符串匹配之horspool算法(简化的BM算法)

    前面介绍在BF,KMP这些算法的时候老是提到BM这个东西,究竟这什么东西,有啥高深的,这些问题我们如今不去考虑.不知道,认真读前几篇文章的读者有没有发现前面的算法都是从模式串的前面開始匹配的,那我们就 ...

  6. LoadRunner测试下载功能点脚本(方法一)

    性能需求:对系统某页面中,点击下载功能做并发测试,以获取在并发下载文件的情况下系统的性能指标. 备注:页面上点击下载时的文件可以是word.excel.pdf等. 问题1:录制完下载的场景后,发现脚本 ...

  7. [小技巧] 把虚拟机中的Linux系统安装到U盘中

    出于各种需求,很多用户可能经常会在Windows系统中安装虚拟机,然后在虚拟机中安装Linux系统.使用虚拟机的优点是可以同时使用多个系统,而缺点也是显然的,也就是程序运行效率较差.   而实际上,L ...

  8. Android实现左右滑动效果

    本示例演示在Android中实现图片左右滑动效果.   关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...

  9. MySql Update Select 嵌套

    UPDATE `TB_CM_Dic` SET `ParentID` = (SELECT `ID` FROM (SELECT * FROM `TB_CM_Dic`) AS B WHERE `DicNam ...

  10. mysql 中的数据类型

    unsigned   既为非负数,用此类型可以增加数据长度! 例如如果    tinyint最大是127,那    tinyint    unsigned    最大   就可以到    127 * ...