谈一下今天的网络赛。。。这次是真的弱爆了。。。。
2011-09-10 21:54
267 查看
对于偶自己来说,比赛时。。。偶只会做4个。。。。
1001:偶有幸遇到了师母= =,特判8个角,然后15数码逆序判定。。。
1002:首先离散化,然后每种x,每种y都只需要覆盖一次就可以了,每个点也仅会覆盖一次,查x和y时二分一下就可以了。。。O(N+N+N)。。
1003:gsb童鞋搞的= =。
1006:不就是个哈密尔顿回路么。。。处理可能要麻烦一点点,没时间写了。。。
1007:线段树啊~开方运算使数字下降的很快,下降到1或者数字是0以后就不用再下降了,开个布尔数组标记一下就行~
1008:奶奶个熊,今天的比赛就吊死在这题上边了。。。一直在用搜索+剪枝做,然后就一直TLE,到最后一算,我擦,所有的最小公倍数组合总共不到40000种,直接dp打表输出不就行了么。。。。这时候比赛还有不到半小时,时间应该够了,结果我sb的在某个语句想当然的弄错了序,接着又把llg写成了int。。。。悲剧到最后没交上。。。。
1001:
View Code
1001:偶有幸遇到了师母= =,特判8个角,然后15数码逆序判定。。。
1002:首先离散化,然后每种x,每种y都只需要覆盖一次就可以了,每个点也仅会覆盖一次,查x和y时二分一下就可以了。。。O(N+N+N)。。
1003:gsb童鞋搞的= =。
1006:不就是个哈密尔顿回路么。。。处理可能要麻烦一点点,没时间写了。。。
1007:线段树啊~开方运算使数字下降的很快,下降到1或者数字是0以后就不用再下降了,开个布尔数组标记一下就行~
1008:奶奶个熊,今天的比赛就吊死在这题上边了。。。一直在用搜索+剪枝做,然后就一直TLE,到最后一算,我擦,所有的最小公倍数组合总共不到40000种,直接dp打表输出不就行了么。。。。这时候比赛还有不到半小时,时间应该够了,结果我sb的在某个语句想当然的弄错了序,接着又把llg写成了int。。。。悲剧到最后没交上。。。。
1001:
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <set> using namespace std; typedef long long llg; int N; llg m, ans, lc[46][40000], dp[46][40000]; llg gcd(llg a, llg b) { if(b == 0) return a; else return gcd(b, a%b); } llg lcm(llg x, llg y) { return x/gcd(x,y)*y; } int Find(int lab, llg x) { int l, r, mid; l = 1, r = lc[lab][0]; while(l <= r) { mid = (l+r) >> 1; if(lc[lab][mid] == x) return mid; else if(lc[lab][mid] > x) r = mid-1; else l = mid+1; } return -1; } int main() { int T, i, j, pos, Case = 0; llg x; set <llg> hash; hash.clear(); hash.insert(1); set <llg> ::iterator it; for(i = 2; i <= 40; i++) { lc[i][0] = 0; for(it = hash.begin(); it != hash.end(); it++) { x = *it; x = lcm(x, i); hash.insert(x); } for(it = hash.begin(); it != hash.end(); it++) { x = *it; ++lc[i][0]; lc[i][lc[i][0]] = x; } } memset(dp, 0, sizeof(dp)); lc[1][0] = 1; lc[1][1] = 1; dp[1][1] = 1; for(i = 2; i <= 40; i++) { pos = Find(i, i); dp[i][pos] += 1; for(j = 1; j <= lc[i-1][0]; j++) { x = lc[i-1][j]; x = lcm(x, i); pos = Find(i, x); dp[i][pos] += dp[i-1][j]; } for(j = 1; j <= lc[i-1][0]; j++) { pos = Find(i, lc[i-1][j]); dp[i][pos] += dp[i-1][j]; } } freopen("data.txt", "r", stdin); scanf("%d", &T); while(T--) { scanf("%d%I64d", &N, &m); ans = 0; i = lc [0]; while(lc [i]>=m && i>=1) { ans += dp [i]; i--; } printf("Case #%d: %I64d\n", ++Case, ans); } return 0; }
相关文章推荐
- 今天复习了一下完成端口网络模型
- C#中Dictionary和HashTable的相同点与不同点(今天又看到了HashSet,所以补充一下)
- 被各种宽度弄晕了,今天就总结一下吧
- 今天开始弄c++,copy下人家的文章来看看参考一下哈哈
- 2015-7-14今天写一下现在的成果吧
- web开发必备-网络基础知识---记录一下
- 网络不停闪断 本地连接一下断开一下连接上
- 介绍一下Sun公司的网络文件系统
- 今天第一次发博客,纪念一下
- 今天是奥运会开幕的日子!mark一下!!
- 今天在看程序,看到了break ,C还不是很好,就查了一下。再次记录一下。以后可以随时查看。
- 今天说一下DML触发器的顺序
- 今天终于装了LATEX,mark一下
- 今天搞清楚了一年半前的那次网络收包错误原因
- 总结一下今天android开发遇到的问题
- 今天装了Redhat Enterprise Linux 5.0 ,体验一下不同的感受.
- 今天把框架升级了一下,整体升级
- 今天在硬件系统中测试了一下程序
- 今天就来给大家聊一下为什么不建议你们自学。
- 反思今天又懈怠了一下