2019-08-20 纪中NOIP模拟B组
T1 [JZOJ3490] 旅游(travel)
题目描述
ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼。终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历。
ztxz16生活的城市有N*M个景点,可以描述成一个N*M的矩形,每个景点有一个坐标(x, y) (1 <= x <= N, 1 <= y <= M)以及美观度A[x][y]和观赏所需的时间B[x][y],从一个景点(x1, y1)走到另一个景点(x2, y2)需要时间为它们之间的曼哈顿距离:|x1 - x2| + |y1 - y2|。
为了防止审美疲劳,ztxz16希望观赏的景点的的美观度是严格上升的,由于不想太早回家码代码,ztxz16希望旅游的总时间尽可能长。
数据范围
对于 $30\%$ 的数据,$1 \leq N,M \leq 50$
对于 $60\%$ 的数据,$1 \leq N,M \leq 300$
对于 $100\%$ 的数据,$1 \leq N,M \leq 1000$,$0 \leq A \leq 10^6$,$0 \leq B \leq 10^9$
分析
数据较水,$O(n^2m^2)$ 可以过,暂没写出 $O(nm)$ 做法
T2 [JZOJ3491] 做梦(dream)
题目描述
ztxz16旅游归来后十分疲倦,很快就进入了梦中。
在梦中ztxz16结婚生子了,他不得不照顾小宝宝。但这实在太无聊了,于是ztxz16会在散步。梦中ztxz16住在一个类似数轴的街上,数轴上的每个整点是一个街区,每个单位时间内ztxz16可以选择向左走一个街区或者向右走一个街区,但如果他离开家超过m个单位时间小宝宝会有危险,因此ztxz16必须在距离上次在家中不超过m个单位时间内回到家中。n个单位时间后ztxz16会醒来,他希望此时正好在家中。
ztxz16想知道散步过程可能有多少种不同的散步过程。两个散步过程被认为不同,当且仅当存在至少一个单位时刻ztxz16选择的走向不同。
数据范围
对于 $30\%$ 的数据,$2 \leq N \leq 100$,$2 \leq M \leq 100$
对于 $100\%$ 的数据,$2 \leq N \leq 10^9$,$2 \leq M \leq 100$
$N$ 和 $M$ 均为偶数
分析
看到数据,很容易想到矩阵乘法
设 $f[i][j]$ 表示不经过起点走 $i$ 步到达 $j$ 位置的不同路径数
于是可以推出初始矩阵为 $$\begin{bmatrix} 0 & 0 & \cdot\cdot\cdot & 0 & f[\frac{m}{2}]\\ 1 & 0 & \cdot\cdot\cdot & 0 & f[\frac{m}{2}-1]\\ 0 & 1 & \cdot\cdot\cdot & 0 & f[\frac{m}{2}-2]\\ \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot\\ 0 & 0 & \cdot\cdot\cdot & 0 & f[2]\\ 0 & 0 & \cdot\cdot\cdot & 1 & f[1] \end{bmatrix}$$
然后只需要求出矩阵 $\frac{n}{2}$ 次幂的最后一项就可以了
(关于这样转移的原因,手推一下前几个矩阵找出最后一项的形成规律就好了,而且也会明白为什么 $f$ 数组记录的是不经过起点的路径数)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f int n, m, ans;
int f[][];
int p = 1e9 + ; struct Mat {
int t[][];
Mat() {memset(t, , sizeof t);}
} x; Mat Mul(Mat a, Mat b) {
Mat c;
for (int i = ; i <= m; i++)
for (int j = ; j <= m; j++)
for (int k = ; k <= m; k++)
c.t[i][j] = (c.t[i][j] + (ll)a.t[i][k] * b.t[k][j] % p) % p;
return c;
} Mat Pow(Mat a, int b) {
Mat c;
for (int i = ; i <= m; i++) c.t[i][i] = ;
while (b) {
if (b & ) c = Mul(c, a);
a = Mul(a, a); b >>= ;
}
return c;
} int main() {
scanf("%d%d", &n, &m);
n >>= ; m >>= ;
f[][m - ] = f[][m + ] = ;
for (int i = ; i <= (m << ); i++)
for (int j = ; j <= (m << ); j++) {
if (j - != m) f[i][j] = (f[i][j] + f[i - ][j - ]) % p;
if (j + != m) f[i][j] = (f[i][j] + f[i - ][j + ]) % p;
}
for (int i = ; i <= m; i++) x.t[i][i - ] = ;
for (int i = ; i <= m; i++) x.t[m + - i][m] = f[i << ][m];
x = Pow(x, n);
printf("%d", x.t[m][m]); return ;
}
T3 [JZOJ3492] 数数(count)
题目描述
ztxz16从小立志成为码农,因此一直对数的二进制表示很感兴趣。今天的数学课上,ztxz16学习了等差数列的相关知识。我们知道,一个等差数列可以用三个数A,B,N表示成如下形式:
B + A, B + 2 * A, B + 3 * A, ..., B + N * A
ztxz16想知道对于一个给定的等差数列,把其中每一项用二进制表示后,一共有多少位是1,但他的智商太低无法算出此题,因此寻求你的帮助。
数据范围
对于 $30\%$ 的数据,$1 \leq T \leq 20$,$1 \leq A \leq 10^4$,$1 \leq B \leq 10^{16}$,$1 \leq N \leq 10^3$
对于 $60\%$ 的数据,$1 \leq T \leq 20$,$1 \leq A \leq 10^4$,$1 \leq B \leq 10^{16}$,$1 \leq N \leq 10^9$
对于 $100\%$ 的数据,$1 \leq T \leq 20$,$1 \leq A \leq 10^4$,$1 \leq B \leq 10^{16}$,$1 \leq N \leq 10^{12}$
分析
对于一个二进制数 $x$,它第 $k$ 位上的数为 $\lfloor \frac{x}{2^{k-1}} \rfloor - \lfloor \frac{x}{2^k} \rfloor \times 2$
所以在等差数列的 $n$ 个数中,第 $k$ 位的总贡献为 $\sum_{i=1}^n \lfloor \frac{b+ai}{2^{k-1}} \rfloor - \lfloor \frac{b+ai}{2^k} \rfloor \times 2$
最后答案就是每一位上的贡献之和
对于形如 $f(a,b,c,n)=\sum_{i=0}^n \lfloor \frac{ai+b}{c} \rfloor$ 的式子,我们会使用类欧几里得算法来计算
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f ll T, A, B, N, f[]; ll calc(ll a, ll b, ll c, ll n) {
if (!a) return b / c * (n + );
if (a < c && b < c) {
ll m = (a * n + b) / c;
if (!m) return ;
return n * m - calc(c, c - b - , a, m - );
}
if (n & )
return calc(a % c, b % c, c, n) + (n + ) / * n * (a / c) + (n + ) * (b / c);
return calc(a % c, b % c, c, n) + n / * (n + ) * (a / c) + (n + ) * (b / c);
} int main() {
scanf("%lld", &T);
while (T--) {
ll ans = ;
scanf("%lld%lld%lld", &A, &B, &N);
for (ll i = , j = ; (i >> ) <= B + A * N; i <<= , j++)
f[j] = calc(A, B + A, i, N - );
for (ll i = , j = ; i <= B + A * N; i <<= , j++)
ans += f[j] - (f[j + ] << );
printf("%lld\n", ans);
} return ;
}
2019-08-20 纪中NOIP模拟B组的更多相关文章
- 2019-08-21 纪中NOIP模拟A组
T1 [JZOJ6315] 数字 题目描述
- 2019-08-15 纪中NOIP模拟B组
T1 [JZOJ3455] 库特的向量 题目描述 从前在一个美好的校园里,有一只(棵)可爱的弯枝理树.她内敛而羞涩,一副弱气的样子让人一看就想好好疼爱她.仅仅在她身边,就有许多女孩子想和她BH,比如铃 ...
- 2019-08-25 纪中NOIP模拟A组
T1 [JZOJ6314] Balancing Inversions 题目描述 Bessie 和 Elsie 在一个长为 2N 的布尔数组 A 上玩游戏. Bessie 的分数为 A 的前一半的逆序对 ...
- 2019-08-23 纪中NOIP模拟A组
T1 [JZOJ2908] 矩阵乘法 题目描述 给你一个 N*N 的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第 K 小数. 数据范围 对于 $20\%$ 的数据,$N \leq 100$,$Q ...
- 2019-08-20 纪中NOIP模拟A组
T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...
- 2019-08-13 纪中NOIP模拟B组
T1 [JZOJ1534] rank 题目描述 小h和小R正在看之前的期末&三校联考成绩,小R看完成绩之后很伤心,共有n个学生,第i个学生有一个总成绩Xi,因为他的排名是倒数第k个,于是小R想 ...
- 2019-08-12 纪中NOIP模拟B组
T1 [JZOJ4879] 少女觉 题目描述 “在幽暗的地灵殿中,居住着一位少女,名为古明地觉.” “据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力——读心.” “掌控人心者,可控 ...
- 2019-08-10 纪中NOIP模拟B组
T1 [JZOJ1235] 洪水 题目描述 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的. 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示 ...
- 2019-08-07 纪中NOIP模拟B组
T1 [JZOJ1385] 直角三角形 题目描述 二维平面坐标系中有N个位置不同的点. 从N个点选择3个点,问有多少选法使得这3个点形成直角三角形. 数据范围 $3 \leq N \leq 1500$ ...
随机推荐
- kms在线激活windows和office
本激活,只适用vol版本的windows系统和office 激活windows在windows中使用管理员方式打开cmd命令输入slmgr /skms chongking.com切换kms服务器地址为 ...
- Linux运维--12.手动部署Rabbit集群
1.安装rabbit组件 10.100.2.51 controller1 10.100.2.52 controller2 10.100.2.53 controller3 #每个节点 yum insta ...
- Vue.js 起步
通过实例来看下 Vue 构造器中需要哪些内容 测试时这段代码我直接写在index.html中 <!DOCTYPE html> <html> <head> <m ...
- 使用ffmpeg为影片添加字幕
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4 The order of -c copy -c:s mov_t ...
- day19 几个模块的学习
# 模块本质上就是一个 .py 文件# 数据类型# 列表.元组# 字典# 集合.frozenset# 字符串# 堆栈:特点:先进后出# 队列:先进先出 FIFO # from collections ...
- 破解“低代码”的4大误区,拥抱低门槛高效率的软件开发新选择 ZT
最近,每个人似乎都在谈论“低代码”.以美国的Outsystems.Kinvey,以及国内的活字格为代表的低代码开发平台,正在风靡整个IT世界.毕竟,能够以最少的编码快速开发应用的想法本身就很吸引人.但 ...
- 两行配置完全解放gradle编译慢问题
Android Studio编译经常出现gradle编译缓慢甚至超时问题,抛开电脑硬件配置不说,主要问题还是国内网络环境的因素影响,可以通过修改项目根目录下的build.gradle文件如下: bui ...
- python3-cookbook笔记:第五章 文件与IO
python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...
- P4197 Peaks [克鲁斯卡尔重构树 + 主席树][克鲁斯卡尔重构树学习笔记]
Problem 在\(Bytemountains\)有\(n\)座山峰,每座山峰有他的高度\(h_i\) .有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个困难值,这个值越大表示越难走, ...
- 解决kbmMW Scheduler在任务中停止任务遇到的问题
procedure TCustomGridViewCameraDoc.InitSchedule; begin Scheduler.Schedule( procedure(const ASchedule ...