【问题描述】

小美很喜欢下象棋。

而且她特别喜欢象棋中的马。

她觉得马的跳跃方式很独特。(以日字格的方式跳跃)

小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标。

一开始\(time=0\)的时候,马在原点。每个时刻马都跳一步。

可是这个坐标图有点残缺,有几个点是不能跳到的。

然后小美很好奇在\(time=[0,K]\)中,马能跳到多少个不同的格子。

【输入格式】

从文件chess.in中读入数据。

第一行两个数K,n表示时间上限和残缺的点的数量。

接下来n行,每行一个坐标 xi,yi 表示一个残缺点的坐标。

【输出格式】

输出到文件chess.out中。

第一行输出一个数字表示答案。由于这个数字会很大,你需要输出他模 1000000007 。

【样例输入】

1 0

【样例输出】

9

【样例输入】

2 7

-1 2

1 2

2 1

2 -1

1 -2

-1 -2

-2 -1

【样例输出】

9

【数据规模】

对于\(30\%\)的数据\(K\le 500\)。

对于\(100\%\)的数据\(0\le K \le 10^{18}, 0\le n\le 440, |xi|\le10, |yi|\le 10\)。

【来源】

CF 57E

题解

一道神奇的乱搞题。

首先,对于一个oier,最基本的技能是暴力,于是我们先用bfs打一个暴力(代码下面会有)。

于是就拿到了37分的好成绩。

但是除了大暴力,我们似乎并没有什么路可走——因为情况非常复杂。

那么这题为什么这么复杂?

因为有这句话:可是这个坐标图有点残缺,有几个点是不能跳到的。

于是我们想到简化:那这句话不在会怎么样?

我们发现一时找不出规律,但我们可以打张表。

#include <cstdio>
#include <queue> using namespace std; int mp[2003][2003];
int ans[6000];//ans[i]:第i步所到新到达的地方 int dirx[] = {1, 1, -1, -1, 2, 2, -2, -2};
int diry[] = {2, -2, 2, -2, 1, -1, 1, -1}; struct sxd
{
int x, y;
}; queue<sxd> Q; int n;
long long k;
long long cnt; inline void bfs(int x, int y)
{
mp[x][y] = 1;
Q.push((sxd){x, y});
while(!Q.empty())
{
sxd tmp = Q.front();
Q.pop();
ans[mp[tmp.x][tmp.y]]++;
if(mp[tmp.x][tmp.y] > 70)
break;
for(int i = 0; i < 8; ++i)
{
int tx = tmp.x + dirx[i];
int ty = tmp.y + diry[i];
if(mp[tx][ty]) continue;
mp[tx][ty] = mp[tmp.x][tmp.y] + 1;
Q.push((sxd){tx, ty});
}
}
} int main()
{
bfs(1001, 1001);
for(int i = 1; i <= 60; ++i)
printf("%d,", ans[i]);
return 0;
}

运行结果:

1,8,32,68,96,120,148,176,204,232,260,288,316,344,372,400,428,456,484,512,540,568,596,624,652,680,708,736,764,792,820,848,876,904,932,960,988,1016,1044,1072,1100,1128,1156,1184,1212,1240,1268,1296,1324,1352,1380,1408,1436,1464,1492,1520,1548,1576,1604,1632,

发现了什么?(并没有发现什么)到了后面项,该数列竟趋向于一个等差数列!

printf("%d,", ans[i]);改成printf("%d,", ans[i+1]-ans[i]);会更清晰:

7,24,36,28,24,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,

然后我们就可以大胆猜想了……

我们发现数据规模中\(|xi|, |yi|\)的值很小,是不是这样就不怎么会影响等差数列的波动幅度?

于是我们需要验证一下

//前面只是把if(mp[tmp.x][tmp.y] > 70)改成了if(mp[tmp.x][tmp.y] > 200)

int main()
{
bfs(1001, 1001);
cin >> n;
for(int i = 1, x, y; i <= n; ++i)
{
cin >> x >> y;
x += 1001;
y += 1001;
mp[x][y] = 1;//这样做还是挺妙的,把残缺坐标直接看成已访问
}
for(int i = 1; i <= 150; ++i)//输出多一些,让结论更可信
printf("%d,", ans[i+1] - ans[i]);
return 0;
}

随便造组数据验证一下:

8
2 3
1 2
2 1
5 6
-1 -2
-2 -1
-3 -4
-3 -2

输出

7,24,36,28,24,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,

经过多次验证,我们就可以很方便地想到正解:先暴力搜索几步(似乎都是选择500步的),然后用等差数列直接求出答案。

于是代码如下

//前面的bfs都差不多,就在写一遍了。

signed main()
{
fin >> k >> n;//由于当时是模拟赛所以用了文件流
for(int i = 1, x, y; i <= n; ++i)
{
fin >> x >> y;
x += 1001;
y += 1001;
mp[x][y] = 1;
}
bfs(1001, 1001);
if(k < 500)
{
for(int i = 1; i <= k+1; ++i)
cnt = (cnt+ans[i])%mod;
fout << cnt << endl;
}
else
{
long long inc = ans[500] - ans[499];//等差数列的公差
k -= 498;
k %= mod;
for(int i = 0; i <= 499; ++i)
cnt = (cnt+ans[i])%mod;
fout << (((k*ans[500]%mod+cnt)%mod+(k*(k-1)>>1)%mod*inc%mod)%mod+mod)%mod << endl;
}
return 0;
}

最后,恭喜你打出了一道tourist当场也没打出来的题。

20180520模拟赛T3——chess的更多相关文章

  1. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  2. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

  3. ztz11的noip模拟赛T3:评分系统

    代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  4. 20180711模拟赛T3——聚变

    文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...

  5. 4.26 省选模拟赛 T3 状压dp 差分求答案

    LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...

  6. NOIP欢乐模拟赛 T3 解题报告

    3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...

  7. 字符串模拟赛T3

    只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring ...

  8. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  9. [模拟赛] T3 Exploit

    Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展 ...

随机推荐

  1. CentOS 7.6 安装Python3.7.2 多版本共存

    CentOS 7.6 默认安装了 Python 2.7.5 准备环境 yum install git gcc gcc-c++ make automake autoconf libtool pcre p ...

  2. Excel 简单使用

    1.Excel复制上一行 注意鼠标的样子 2.删除多行 删除之后如图所示: 删除多列也是同样的操作 3.日期格式不能按照数据库的形式进行输入 数字的位数太多输入之后改变了数字,可以设置为文本格式,进行 ...

  3. LeetCode 717. 1比特与2比特字符(1-bit and 2-bit Characters)

    717. 1比特与2比特字符 LeetCode717. 1-bit and 2-bit Characters 题目描述 有两种特殊字符.第一种字符可以用一比特0来表示.第二种字符可以用两比特(10 或 ...

  4. 【转载】数字IC设计流程及开发工具

    原文链接:https://www.zhihu.com/question/28322269/answer/42048070 Design Flow &amp;lt;img src="h ...

  5. 『正睿OI 2019SC Day3』

    容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...

  6. Xgboost GPU配置

    眼残cmake版本配错了搞了半天,简单记录一下,老规矩,参考一下官方的文档. git clone --recursive https://github.com/dmlc/xgboost cd xgbo ...

  7. Oracle For Linux 恢复日记 霆智X8III

    公司最近的客户需要在LINUX系统中做数据迁移,备份出来的内容数据库物理文件,回档日志和SpfileXXXX 客户用的是北京霆智的X8备份阵列,X8与数据库服务器都放在IDC机所,IDC机房与客户之间 ...

  8. Prime Path POJ-3126

    The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...

  9. FullCalendar日历插件说明文档(看到这篇手册,解决了困扰我3天的js问题)

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  10. elementUI的导航栏在刷新页面的时候选中状态消失的解决

    首先elementUI的导航栏中的选中项的高亮显示时的字体颜色可以在属性中设置,但是高亮时的背景颜色不能设置,所以要自己修改高亮的背景颜色 .el-menu-item.is-active { back ...