hdu 4028 2011上海赛区网络赛H dp+map离散

一开始用搜索直接超时,看题解会的

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<map>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<vector>
 7 #include<queue>
 8 #include<algorithm>
 9 #include<set>
10 #define inf 110000
11 #define M 10005
12 #define N 10005
13 #define Min(a,b) ((a)<(b)?(a):(b))
14 #define Max(a,b) ((a)>(b)?(a):(b))
15 #define pb(a) push_back(a)
16 #define mem(a,b) memset(a,b,sizeof(a))
17 #define eps 1e-9
18 #define zero(a) fabs(a)<eps
19 #define LL long long
20 #define MOD 1000000007
21 using namespace std;
22 map<LL,LL>dp[45];
23 map<LL,LL>::iterator it;
24 LL gcd(LL a,LL b){
25     return b==0?a:gcd(b,a%b);
26 }
27 LL lcm(LL a,LL b){
28     return a/gcd(a,b)*b;
29 }
30 void DP(){
31     dp[1][1]=1;
32     for(int i=2;i<=40;i++){
33         dp[i]=dp[i-1];   //不取第i个数的所有情况,先复制过来
34         dp[i][i]++;      //只取第i个数,不能落下
35         for(it=dp[i-1].begin();it!=dp[i-1].end();it++)
36             dp[i][lcm(i,it->first)]+=it->second;   //然后考虑在前i-1个数的基础上加入第i个数
37     }
38 }
39 LL n,m;
40 int main(){
41     DP();
42     int t,cas=0;
43     scanf("%d",&t);
44     while(t--){
45         scanf("%I64d%I64d",&n,&m);
46         LL ans=0;
47         //遍历一遍
48         for(it=dp[n].begin();it!=dp[n].end();it++)
49             if(it->first>=m)
50                 ans+=it->second;
51         printf("Case #%d: %I64d\n",++cas,ans);
52     }
53     return  0;
54 }
时间: 2024-10-10 09:35:17

hdu 4028 2011上海赛区网络赛H dp+map离散的相关文章

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 4023 2011上海赛区网络赛C 贪心+模拟

以为是贪心,结果不是,2333 贪心最后对自己绝对有利的情况 点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000000

hdu 4025 2011上海赛区网络赛E 压缩 ***

直接T了,居然可以这么剪枝 题解链接:点我 1 #include<cstdio> 2 #include<map> 3 #include<cstring> 4 #define ll __int64 5 using namespace std; 6 ll a[23],x[23][5],ans; 7 map<ll,ll>p; 8 void dfs(int d,int n,ll res,int f) 9 { 10 if(d==n){ 11 if(f) p[res]+

hdu 4027 2011上海赛区网络赛 线段树 成段平方根 ***

不能直接使用成段增减的那种,因为一段和的平方根不等于平方根的和,直接记录是否为1,是1就不需要更新了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #de

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4036 2011成都赛区网络赛F 模拟 **

为了确保能到达终点,我们需要满足下面两个条件 1.能够到达所有山顶 2.能够在遇到苦土豆时速度大于他 二者的速度可以用能量守恒定律做,苦土豆的坐标可通过三角形相似性来做 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using na

hdu 4044 2011北京赛区网络赛E 树形dp ****

专题训练 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1010; 7 const int INF=0x3fffffff; 8 struct Node 9 { 10 int to; 11 int next; 12 }edge[MAXN*2]; 13 int t

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000