hdu-4028 The time of a day
生活随笔
收集整理的這篇文章主要介紹了
hdu-4028 The time of a day
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/**題意:給你1~n個數,問你它的子集內有多少集合的Lcm(最小公倍數)大于等于m的;題解:DP離散化,用map映射一下,map<LL,LL>dp[i]。表示i個數,可以有it->second種情況組成it->first。也算是長姿勢了,map的用法感覺懂得還是太少了
**/
#include<cstdio>
#include<map>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 LL;
map<LL,LL> dp[50];
map<LL,LL>::iterator it;
LL m,n;
LL gcd(LL a,LL b){return b == 0 ? a : gcd(b,a%b);
}
LL Lcm(LL a,LL b){return a * b / gcd(a,b);
}
void init(){dp[1][1] = 1;for(LL i = 2;i <= 40;i++){dp[i] = dp[i-1];//不取第i個的所有情況dp[i][i] ++;//只取第i個for(it = dp[i-1].begin();it != dp[i-1].end();it ++){dp[i][Lcm(i,it->first)] += it->second;//在前i-1的基礎上加上第i個數}}
}
int main(){init();int t,ca = 1;cin >> t;while(t--){cin >> n >> m;LL ans = 0;for(it = dp[n].begin();it != dp[n].end();it++)//統計一下n個數組成子集滿足條件的個數if(it->first >= m)ans += it->second;printf("Case #%d: %I64d\n",ca++,ans);
// cout << ans << endl;}return 0;
}
總結
以上是生活随笔為你收集整理的hdu-4028 The time of a day的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bnu- 34985 Elegant S
- 下一篇: 图解 Kafka,看本篇就足够啦