解题报告:HDU_5656 CA Loves GCD DP
2017-07-24 20:17
218 查看
题目链接
题意:
给n个不同的数,求所有非空子集的gcd之和
思路:
dp[ i ] 表示 gcd 为 i 的子集数
每读入一个新的数x,可以如果将x与gcd为i的放在一起会导致gcd(x,i)的方案数增加dp[ i ] 种
如果 i = x,那么还会额外多一种方案(只放x)。
因为 较小的gcd(x,i)可能会用到同阶段的较大的 i ,所有操作顺序要从小到大。
代码:
#include<bits/stdc++.h>
const long long mod = 1e8+7;
using namespace std;
const int N = 1005;
int dp
;
int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(dp,0,sizeof(dp));
int n,x,m = 0;
scanf("%d",&n);
while(n--){
scanf("%d",&x);
m = max(m,x);
for(int i=1;i<=m;i++){
if(i==x)dp[i] = ( ( dp[i]*2 ) + 1 ) % mod;
else if(dp[i]){
int j = __gcd(i,x);
dp[j] = (dp[j] + dp[i]) % mod;
}
}
}long long ans =0;
for(int i=1;i<=m;i++){
ans = (ans + 1LL * i * dp[i] % mod)% mod;
}printf("%I64d\n",ans);
}return 0;
}
题意:
给n个不同的数,求所有非空子集的gcd之和
思路:
dp[ i ] 表示 gcd 为 i 的子集数
每读入一个新的数x,可以如果将x与gcd为i的放在一起会导致gcd(x,i)的方案数增加dp[ i ] 种
如果 i = x,那么还会额外多一种方案(只放x)。
因为 较小的gcd(x,i)可能会用到同阶段的较大的 i ,所有操作顺序要从小到大。
代码:
#include<bits/stdc++.h>
const long long mod = 1e8+7;
using namespace std;
const int N = 1005;
int dp
;
int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(dp,0,sizeof(dp));
int n,x,m = 0;
scanf("%d",&n);
while(n--){
scanf("%d",&x);
m = max(m,x);
for(int i=1;i<=m;i++){
if(i==x)dp[i] = ( ( dp[i]*2 ) + 1 ) % mod;
else if(dp[i]){
int j = __gcd(i,x);
dp[j] = (dp[j] + dp[i]) % mod;
}
}
}long long ans =0;
for(int i=1;i<=m;i++){
ans = (ans + 1LL * i * dp[i] % mod)% mod;
}printf("%I64d\n",ans);
}return 0;
}
相关文章推荐
- HDU 2602 Bone Collector 解题报告(dp入门题)
- hdu 1044 Collect More Jewels 解题报告 + 状态压缩分析
- HDU 2001 计算两点间的距离 解题报告
- HDU 2005 第几天?解题报告
- hdu 1878 欧拉回路 解题报告
- hdu_Palindromes _easy version_解题报告
- 解题报告:HDU_4947:GCD Array 莫比乌斯反演+树状数组
- HDU 3873 必须写一个解题报告,很神奇的最短路
- HDU 3509解题报告
- hdu_2030_汉字统计_解题报告
- HDU 2254解题报告
- hdu_2001_计算两点间的距离_解题报告
- hdu 1913 computer 部分贪心+一维dp 解题报告
- hdu_2002_计算球体积_解题报告
- hdu 2243考研路茫茫——单词情结—解题报告
- HDU_2055解题报告(JAVA)
- Tempter of the Bone(HDU 1010)解题报告
- hdu 2544 最短路 Bellman_Ford 解题报告
- 解题报告: HDU_4407 Sum 容斥+暴力
- hdu 1166 敌兵布阵 (解题报告)