【题目描述】

小 C 喜欢跑步,并且非常喜欢在微信步数排行榜上刷榜,为此他制定了一个刷微信步数的计划。

他来到了一处空旷的场地,处于该场地中的人可以用 k 维整数坐标 (a1, a2, · · · , ak)来表示其位置。场地有大小限制,第 i 维的大小为 wi,因此处于场地中的人其坐标应满足 1≤ai≤wi(1≤i≤k)。

小 C 打算在接下来的 P=w1×w2×⋅⋅⋅×wk 天中,每天从场地中一个新的位置出发,开始他的刷步数计划(话句话说,他将会从场地中每个位置都出发一次进行计划)。

他的计划非常简单,每天按照事先规定好的路线行进,每天的路线由 n 步移动构成,每一步可以用 ci 与 di 表示:若他当前位于 (a1, a2, · · · , aci, · · · , ak),则这一步他将会走到 (a1, a2, · · · , aci + di, · · · , ak),其中 1≤ci≤k,di∈{−1,1}。小 C 将会不断重复这个路线,直到他走出了场地的范围才结束一天的计划。(即走完第 n 步后,若小 C 还在场内,他将回到第 1 步从头再走一遍)。

小 C 对自己的速度非常有自信,所以他并不在意具体耗费的时间,他只想知道 P天之后,他一共刷出了多少步微信步数。请你帮他算一算。

【输入】

第一行两个用单个空格分隔的整数 n,k。分别表示路线步数与场地维数。

接下来一行 k 个用单个空格分隔的整数 wi,表示场地大小。

接下来 n 行每行两个用单个空格分隔的整数 ci,di,依次表示每一步的方向,具体意义见题目描述。

【输出】

仅一行一个整数表示答案。答案可能很大,你只需要输出其对 109+7 取模后的值。

若小 C 的计划会使得他在某一天在场地中永远走不出来,则输出一行一个整数 −1。

【输入样例】

3 2
3 3
1 1
2 −1
1 1

【输出样例】

21

【提示】

【样例 1 解释】

从 (1, 1) 出发将走 2 步,从 (1, 2) 出发将走 4 步,从 (1, 3) 出发将走 4 步。

从 (2, 1) 出发将走 2 步,从 (2, 2) 出发将走 3 步,从 (2, 3) 出发将走 3 步。

从 (3, 1) 出发将走 1 步,从 (3, 2) 出发将走 1 步,从 (3, 3) 出发将走 1 步。

共计 21 步

【样例 2 输入】

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

【样例 2 输】

10265

【数据范围】

测试点编号 n ≤ k ≤ wi≤
1 ∼ 3 5 5 3
4 ∼ 6 100 3 10
7 ∼ 8 105 1 105
9 ∼ 12 2 106
13 ∼ 16 5×105 10
17 ∼ 20 3 109

对于所有测试点,保证 1≤n≤5×105,1≤k≤10,1≤wi≤109,di∈{−1,1}。

【下载】

下载附件文件

代码:

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = (a); i <= int(b); i++)
#define per(i, a, b) for (int i = (a); i >= int(b); i--)
using namespace std;typedef long long ll;
const int maxn = 5e5, mod = 1e9 + 7;int n, k, w[10], c[maxn + 5], d[maxn + 5], dt[10], res, S[11][11], inv[12];struct foo {int z[10], l[10], r[10];void reset() {memset(z, 0, k << 2);memset(l, 0, k << 2);memset(r, 0, k << 2);}foo() {reset();}int walk(int c, int d) {z[c] += d;if (z[c] < l[c] || z[c] > r[c]) {l[c] = min(l[c], z[c]);r[c] = max(r[c], z[c]);return d;}return 0;}
} F, B;inline void red(int &x) {x += x >> 31 & mod;
}void prework(int n) {S[0][0] = 1;rep(i, 1, n) rep(j, 1, i) {S[i][j] = (S[i - 1][j - 1] + ll(S[i - 1][j]) * j) % mod;}inv[1] = 1;rep(i, 2, n + 1) {inv[i] = ll(mod - mod / i) * inv[mod % i] % mod;}
}int calc(int k, int n) {int s = 0, c = 1;rep(i, 0, k) {c = ll(c) * max(0, n - i) % mod;s = (s + ll(c) * inv[i + 1] % mod * S[k][i]) % mod;}return s;
}int work(int a[]) {int lim = mod;rep(i, 0, k - 1) if (dt[i]) {lim = min(lim, (a[i] + dt[i] - 1) / dt[i]);}int dp[11] = { 1 };rep(i, 0, k - 1) {per(j, i, 0) {dp[j + 1] = (dp[j + 1] + ll(mod - dt[i]) * dp[j]) % mod;dp[j] = ll(a[i]) * dp[j] % mod;}}int res = 0;rep(i, 0, k) {res = (res + ll(dp[i]) * calc(i, lim)) % mod;}return res;
}int main() {scanf("%d %d", &n, &k);prework(k);rep(i, 0, k - 1) {scanf("%d", &w[i]);}rep(i, 1, n) {scanf("%d %d", &c[i], &d[i]), c[i]--;if (F.walk(c[i], d[i]) && F.r[c[i]] - F.l[c[i]] <= w[c[i]]) {int x = 1;rep(j, 0, k - 1) if (j != c[i]) {x = ll(x) * max(0, w[j] - F.r[j] + F.l[j]) % mod;}res = (res + ll(i) * x) % mod;}}rep(i, 1, n) if (F.z[c[i]] < 0) {d[i] = -d[i];}rep(i, 0, k - 1) if (F.z[i] < 0) {F.z[i] = -F.z[i];swap(F.l[i], F.r[i]);F.l[i] = -F.l[i];F.r[i] = -F.r[i];}B = F;bool chk = true;rep(i, 0, k - 1) {dt[i] = B.z[i];chk &= dt[i] == 0;}if (chk) {bool ok = false;rep(i, 0, k - 1) {ok |= B.r[i] - B.l[i] >= w[i];}printf("%d\n", ok ? res : -1);exit(0);}int a[10] = {};rep(i, 1, n) {if (F.walk(c[i], d[i]) && F.r[c[i]] - F.l[c[i]] <= w[c[i]]) {bool ok = true;rep(j, 0, k - 1) if (j != c[i]) {ok &= w[j] - F.r[j] + F.l[j] > 0;}if (!ok) {continue;}rep(j, 0, k - 1) if (j != c[i]) {a[j] = w[j] - F.r[j] + F.l[j];}a[c[i]] = w[c[i]] - F.r[c[i]] + F.l[c[i]] + 1, res = (res + ll(i) * work(a)) % mod;a[c[i]] = w[c[i]] - F.r[c[i]] + F.l[c[i]], res = (res + ll(mod - i) * work(a)) % mod;}}rep(i, 0, k - 1) {a[i] = max(0, w[i] - B.r[i] + B.l[i]);}res = (res + ll(n) * work(a)) % mod;printf("%d\n", res);return 0;
}

信息学奥赛一本通(C++版)NOIP提高组微信步数相关推荐

  1. 经典问题的另类解法——以信息学奥赛一本通c++版1216红与黑为例

    题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn) 题目描述: 有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动 ...

  2. 信息学奥赛一本通c++版在线评测系统_OPPO Reno3 Pro评测:迄今为止最“性感”的5G手机...

    一.前言和图赏 今年我们看到了一个不一样的OPPO,畅销多年的R系列停更,由Reno接棒开启OPPO手机的下个十年. 可能是刚开启的新产品线,用户接受度还不高,Reno目前还没有表现出R系列的辉煌,但 ...

  3. 信息学奥赛一本通c++版在线评测系统_Redmi K30S至尊纪念版评测:2299元还有谁

    一.前言和图赏 自去年Redmi推出K30之后,这个系列开始频繁推出新机型,迄今为止至少有5款机型在售,比产品线更新的还要快. 这是为何?一切都要从卢伟冰接手Redmi说起,扛起了小米性价比大旗,而小 ...

  4. 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划 第一节 动 ...

  5. 信息学奥赛一本通1114:白细胞计数 视频题解

    信息学奥赛一本通1114:白细胞计数 视频题解 1114:白细胞计数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 38224 通过数: 12593 [题目描述] 医院采样了某临 ...

  6. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

  9. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

最新文章

  1. 一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)
  2. MicroProfile 1.2新增功能介绍
  3. Kali Linux Web 渗透测试— 第十二课-websploit
  4. 微服务网关 Kong 快速上手攻略
  5. 浅谈对离散型随机变量期望的理解
  6. 流水线技术在高速数字电路设计中的应用
  7. [Redis6]Bitmaps与set对比
  8. Spring Boot + JPA + Freemarker 实现后端分页 完整示例
  9. 百度地图2021十一大数据:全国高速拥堵里程超7000公里
  10. UVA11661 Burger Time?【文本处理】
  11. 若不能细水长流地书写内心的温柔,那轰轰烈烈的一幕一幕不过是日后回忆自己爱无能的证据罢了。...
  12. MySQL主从复制 + Mycat实现读写分离
  13. 树莓派无法打开摄像头模块,无法识别摄像头
  14. 文件和磁盘存储器管理
  15. 全球时区(查询备用)
  16. select 函数用法
  17. yarn报错Tarball is not in network and can not be located in cache
  18. 使用 logrotate 配置 supervisor 进行日志管理按天备份
  19. 在centOS中安装MySQL时遇到Configuring incomplete,errors occurred该怎么办?
  20. 虚拟机.linux.pgf90

热门文章

  1. 为什么说网络安全是风口行业?是IT行业最后的红利?
  2. VS2019实现简易的射击坦克小游戏(easyx)
  3. 参考文献标号字体_论文参考文献的引用及自动编号
  4. 蓝桥杯 : 乘积尾零
  5. 解决IDEA按键失效
  6. 新华三、浪潮云的政务云端竞技
  7. Glide4用法全解析
  8. 批量删除微信好友终于来了丨憋了2个半月,微信一口气上了19个新功能
  9. 对元宇宙 我们期待什么?
  10. 【Windows10】电脑副屏的指示箭头是什么?