hdu5656 CA Loves GCD
2016-04-03 20:33
316 查看
题意:给你n个数ai,n和ai范围在1到1000之间,问这些数任意不重复组合的最大公约数之和取模100000007的结果。
思路:设dp[i][j]表示前i个数里任意组合后的最大公约数为j的个数。
则它的转移方程就是:dp[i+1][j]+=dp[i][j].如果dp[i][j]存在则与当前a[i+1]求一次最大公约数: dp[i+1][gcd(j,a[i])]+=dp[i][j]
思路:设dp[i][j]表示前i个数里任意组合后的最大公约数为j的个数。
则它的转移方程就是:dp[i+1][j]+=dp[i][j].如果dp[i][j]存在则与当前a[i+1]求一次最大公约数: dp[i+1][gcd(j,a[i])]+=dp[i][j]
#include<bits/stdc++.h> using namespace std; const int mod=100000007; int dp[1010][1010],a[1010]; int gcd(int a,int b) {return b==0? a: gcd(b,a%b);} int main() { int T;scanf("%d",&T); while(T--){ int n,V=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); V=max(V,a[i]); } memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ dp[i][a[i]]=1; for(int j=V;j>=1;j--){ dp[i][j]=(dp[i][j]+dp[i-1][j])%mod; if(dp[i-1][j]){ dp[i][gcd(a[i],j)]=(dp[i][gcd(a[i],j)]+dp[i-1][j])%mod; } } } long long ans=0; for(int i=1;i<=V;i++) ans=(ans+(long long)i*dp [i])%mod; printf("%lld\n",ans); } }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray