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组的更多相关文章

  1. 2019-08-21 纪中NOIP模拟A组

    T1 [JZOJ6315] 数字 题目描述

  2. 2019-08-15 纪中NOIP模拟B组

    T1 [JZOJ3455] 库特的向量 题目描述 从前在一个美好的校园里,有一只(棵)可爱的弯枝理树.她内敛而羞涩,一副弱气的样子让人一看就想好好疼爱她.仅仅在她身边,就有许多女孩子想和她BH,比如铃 ...

  3. 2019-08-25 纪中NOIP模拟A组

    T1 [JZOJ6314] Balancing Inversions 题目描述 Bessie 和 Elsie 在一个长为 2N 的布尔数组 A 上玩游戏. Bessie 的分数为 A 的前一半的逆序对 ...

  4. 2019-08-23 纪中NOIP模拟A组

    T1 [JZOJ2908] 矩阵乘法 题目描述 给你一个 N*N 的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第 K 小数. 数据范围 对于 $20\%$ 的数据,$N \leq 100$,$Q ...

  5. 2019-08-20 纪中NOIP模拟A组

    T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...

  6. 2019-08-13 纪中NOIP模拟B组

    T1 [JZOJ1534] rank 题目描述 小h和小R正在看之前的期末&三校联考成绩,小R看完成绩之后很伤心,共有n个学生,第i个学生有一个总成绩Xi,因为他的排名是倒数第k个,于是小R想 ...

  7. 2019-08-12 纪中NOIP模拟B组

    T1 [JZOJ4879] 少女觉 题目描述 “在幽暗的地灵殿中,居住着一位少女,名为古明地觉.” “据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力——读心.” “掌控人心者,可控 ...

  8. 2019-08-10 纪中NOIP模拟B组

    T1 [JZOJ1235] 洪水 题目描述 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的. 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示 ...

  9. 2019-08-07 纪中NOIP模拟B组

    T1 [JZOJ1385] 直角三角形 题目描述 二维平面坐标系中有N个位置不同的点. 从N个点选择3个点,问有多少选法使得这3个点形成直角三角形. 数据范围 $3 \leq N \leq 1500$ ...

随机推荐

  1. R语言入门:向量的运算

    向量之间的加减乘除运算: > x <- 1 > x [1] 1 2 3 4 5 6 7 8 9 10 > x=x+1 > x [1] 2 3 4 5 6 7 8 9 10 ...

  2. Android 有关在ListView RecycleView 中使用EditText Checkbox的坑

    这是一篇文字超多的博客,哈哈哈,废话自行过滤··· 遇到问题 在开发中我们常会在ListView , RecycleView 列表中添加EditText输入框,或者checkbox复选框.   复选框 ...

  3. 试题 基础练习 Huffuman树

    试题 基础练习 Huffuman树 试题 基础练习 Huffuman树 ​ 翻了翻网上,基本都是暴力排序.我就提供一个最小堆的写法吧! ​ 点击这里,跳转查看最小堆插入删除函数的简单写法 Talk i ...

  4. Dijkstra算法2

    // 再来一手精髓的Dijkstra // 复杂度O( E*log(V) ) #include <cstdio> #include <iostream> #include &l ...

  5. 装饰器(Python)

    装饰器(decorators)是 Python 的一个重要部分.简单地说:装饰器是修改其他函数的功能的函数,能让我们的代码更容易被扩展,更加简短.举个例子: def login(): print(&q ...

  6. JS DOM用不同方法获取节点及对节点插入、复制和移除

    操作节点的方法 appendChild() insertBefore() replaceChild() cloneNode() normalize() splitText() sppendChild( ...

  7. mysql必知必会--使用MySQL

    连接 在具有可供使用的MySQL DBMS和客户机软件之后,有必要简要讨 论一下如何连接到数据库. MySQL与所有客户机 - 服务器DBMS一样,要求在能执行命令之前登 录到DBMS.登录名可以与网 ...

  8. 程序员为什么害怕低代码?ZT

    转自:https://www.jianshu.com/p/cd89fe94cd30 低代码 是一种近些年兴起的企业软件快速开发技术和工具.借助低代码使用者无需编码即可完成企业应用的常用功能,少量编码扩 ...

  9. layui导出表格设置常用函数

    1.设置导出单元格为数字格式 字段名: function (value, line, data) { return { v: value, t: 'n' } }

  10. css基础-盒子模型+背景和列表

    border-style的值: none 无 dotted 点状 dashed 虚线 solid 实线 double 双实线 margin: 垂直方向两个相邻元素都设置了外边距,那么外边距会发生合并 ...