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. 学会springboot多环境配置方案不用5分钟

    一 前言 本篇文章的主题是在springboot中写多个配置文件,指定让个配置文件生效,以便于达到在开发环境,测试环境,线上环境根据不同的配置灵活应用:读完本篇你将获得,学会springboot的多环 ...

  2. JavaScript 基础学习(一)JavaScript 简介

    定义 JavaScript是基于对象和事件驱动的语言,应用与客户端.其中: 基于对象:提供好了很多对象,可以直接拿过来使用 事件驱动:html做网站静态效果,javascript动态效果(网页能根据客 ...

  3. 使用JDBC获取数据库中的一条记录并封装为Bean

    比如我数据库中存入的是一条一条的用户信息,现在想取出一个人的个人信息,并封装为Bean对象,可以使用queryForObject来获取数据并通过new BeanPropertyRowMapper(Be ...

  4. 加速github访问速度

    打开https://www.ipaddress.com/ 查询以下三个链接的DNS解析地址 github.com assets-cdn.github.com github.global.ssl.fas ...

  5. JS DOM中getElement系列和querySelector系列获取节点

    节点查找方法 document.getElementById() 前面必须是document document.getElementsByName()  前面必须是document ele.getEl ...

  6. 回炉重造之重读Windows核心编程-001-错误处理

    Windows处理错误靠的是API的返回值,类型不止一种种: VOID,函数不可能失败,Windows API的返回值很少是这个情况. BOOL,如果函数失败,则返回值是0,否则返回是非零值.不要测试 ...

  7. Bash脚本编程学习笔记08:函数

    官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...

  8. Pycharm每次新建工程都要重新安装相关库的解决办法

    之前自己每次重建工程时,都不厌其烦的重新安装了第三方的库,直接在pycharm的terminal中利用pip安装,或者鼠标放在所需库的红色波浪线上 直接点击Install Package XXX 后面 ...

  9. 面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?

    当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫. 礼貌地说:"7K是吗?了解了.嗯~其实我对贵司的面试官印象很好.只不过,现在我的手头上已经有一份11K的offer. ...

  10. 各大原厂看好MRAM发展

    MRAM是一种以电阻为存储方式结合非易失性及随机访问两种特性,可以兼做内存和硬盘的新型存储介质.写入速度可达NAND闪存的数千倍,此外,其制作工艺要求低,良品率高,可以很好的控制成本.在寿命方面,由于 ...