您的位置:首页 > 理论基础 > 计算机网络

谈一下今天的网络赛。。。这次是真的弱爆了。。。。

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

#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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: