先判定无解,当且仅当存在一个位置使得移动$n$步后没有结束且仍在原地

暴力枚举移动的步数,记$S_{i}$为移动$i$步(后)未离开范围的点个数,则恰好移动$i$步的人数为$S_{i-1}-S_{i}$(特别的$S_{0}=P$),答案即为$\sum_{i=1}^{D}(S_{i-1}-S_{i})i=\sum_{i=0}^{D-1}S_{i}$(其中$D=\min_{S_{i}=0}i$)

考虑如何求出$S_{i}$,记$len_{j}$为第$j$维的合法范围,由于每一维互不干扰,则有$S_{i}=\prod_{j=1}^{m}len_{j}$

由于每$n$步必然重复向一个方向移动,那么$D\le n\max w_{i}$,总复杂度即$o(nm\max w_{i})$

进一步优化,将$S_{i}$按$i\ mod\ n$的值分组,对于第$i$组($i\in [0,n)$),$i$单独计算,然后求出$i+n$时的$len_{j}$,记$n$步的总位移为$d_{i}$,则第$kn+i(k\ge 1)$步时$len'_{j}=\max(len_{j}-(k-1)|d_{j}|,0)$

写成式子,即$\sum_{k=1}^{D'}\prod_{j=1}^{m}(len_{j}+|d_{j}|-k|d_{j}|)$(其中$D'=\min_{j=1}^{m}\frac{len_{j}}{|d_{j}|}$,因为$\max$取0后一定为0,不需要再计算)

将后式$o(m^{2})$暴力展开,那么就是一个关于$k$的一个$m+1$次多项式,多项式的前缀和也可以$o(m^{2})$计算,总复杂度即为$o(nm^{2})$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define M 20
5 #define mod 1000000007
6 int n,m,ans,w[M],x[N],y[N],d[M],mx[N<<1][M],mn[N<<1][M],g[M],sum[M][M];
7 int ksm(int n,int m){
8 if (!m)return 1;
9 int s=ksm(n,m>>1);
10 s=1LL*s*s%mod;
11 if (m&1)s=1LL*s*n%mod;
12 return s;
13 }
14 int mul(int x,int y){
15 for(int i=m+1;i;i--)g[i]=(1LL*g[i-1]*x+1LL*g[i]*y)%mod;
16 g[0]=1LL*g[0]*y%mod;
17 }
18 int calc(int k,int x){
19 int s=1,ans=0;
20 for(int i=0;i<=k+1;i++){
21 ans=(ans+1LL*s*sum[k][i])%mod;
22 s=1LL*s*x%mod;
23 }
24 return ans;
25 }
26 int main(){
27 scanf("%d%d",&n,&m);
28 sum[0][1]=1;
29 for(int i=1;i<=m;i++){//i+1次多项式,
30 int y=0;
31 for(int x=0;x<=i+1;x++){
32 y=(y+ksm(x,i))%mod;
33 memset(g,0,sizeof(g));
34 g[0]=y;
35 for(int j=0;j<=i+1;j++)
36 if (j!=x){
37 mul(1,mod-j);
38 mul(0,ksm((x-j+mod)%mod,mod-2));
39 }
40 for(int j=0;j<=i+1;j++)sum[i][j]=(sum[i][j]+g[j])%mod;
41 }
42 }
43 for(int i=1;i<=m;i++)scanf("%d",&w[i]);
44 for(int i=1;i<=n;i++){
45 scanf("%d%d",&x[i],&y[i]);
46 d[x[i]]+=y[i];
47 for(int j=1;j<=m;j++){
48 mx[i][j]=max(mx[i-1][j],d[j]);
49 mn[i][j]=min(mn[i-1][j],d[j]);
50 }
51 }
52 for(int i=n+1;i<=2*n;i++){
53 d[x[i-n]]+=y[i-n];
54 for(int j=1;j<=m;j++){
55 mx[i][j]=max(mx[i-1][j],d[j]);
56 mn[i][j]=min(mn[i-1][j],d[j]);
57 }
58 }
59 for(int i=1;i<=m;i++)d[i]/=2;
60 bool flag1=0,flag2=0;
61 for(int i=1;i<=m;i++)
62 if (d[i])flag1=1;
63 for(int i=1;i<=m;i++)
64 if (mx[n][i]-mn[n][i]>w[i])flag2=1;
65 //flag1说明离开了原位置,flag2说明一定是一轮
66 if ((!flag1)&&(!flag2)){
67 printf("-1");
68 return 0;
69 }
70 for(int i=0;i<n;i++){
71 int s=1;
72 for(int j=1;j<=m;j++)s=1LL*s*max(w[j]-(mx[i][j]-mn[i][j]),0)%mod;
73 ans=(ans+s)%mod;
74 }
75 for(int i=n;i<2*n;i++){
76 bool flag=0;
77 for(int j=1;j<=m;j++)
78 if (w[j]-(mx[i][j]-mn[i][j])<0)flag=1;
79 if (flag)break;
80 memset(g,0,sizeof(g));
81 g[0]=1;
82 for(int j=1;j<=m;j++)mul(mod-abs(d[j]),w[j]-(mx[i][j]-mn[i][j])+abs(d[j]));
83 int D=0x3f3f3f3f;
84 for(int j=1;j<=m;j++)
85 if (d[j])D=min(D,(w[j]-(mx[i][j]-mn[i][j]))/abs(d[j])+1);
86 for(int j=0;j<=m;j++)ans=(ans+1LL*g[j]*calc(j,D))%mod;
87 }
88 printf("%d",ans);
89 }

[luogu7116]微信步数的更多相关文章

  1. 【Redis面试题】如何使用Redis实现微信步数排行榜?

    1. 前言 之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这5种数据结构各自的使用场景,不过一直也没来得及写. 碰巧,在3月份找工作面试时,有个面试官先问 ...

  2. 「NOIP 2020」微信步数(计数)

    「NOIP 2020」微信步数(Luogu P7116) 题意: 有一个 \(k\) 维场地,第 \(i\) 维宽为 \(w_i\),即第 \(i\) 维的合法坐标为 \(1, 2, \cdots, ...

  3. [NOIP 2020] 微信步数

    一.题目 点此看题 二.题目 首先感谢一下这位大佬的博客,虽然我看不懂您的讲解,但是还是读得懂代码的 思路是 \(\tt jys\) 给我讲明白的,首先我们可以感觉到快速计算它肯定和矩形有关系,也就是 ...

  4. 洛谷 P7116 - [NOIP2020] 微信步数(拉格朗日插值)

    洛谷题面传送门 我竟然独立切掉了这道题!incredible! 纪念我逝去的一上午(NOIP 总时长 4.5h,这题做了我整整 4.5h) 首先讲一下现场我想的 80 分的做法,虽然最后挂成了 65 ...

  5. pyechart基本使用大全

    charts_base 原文链接:https://blog.csdn.net/weixin_43735353/article/details/89328048 图表详细配置请参考 图表配置篇 基本图表 ...

  6. 小白学Python(17)——pyecharts 日历图 Calendar

    Calendar-2017年微信步数情况 import datetime import random from pyecharts import options as opts from pyecha ...

  7. .Net Core2.*学习手册

    1.net core 基础知识解析(创建一个.net core网站)(视频录制) 1.1 Startup解析(没写) 1.2 目录结构分析(没写) 1.3 使用静态文件(没写) 1.4 Control ...

  8. 最新Pyecharts-基本图表

    Pyecharts是由Echarts而来,Echarts是百度开源的数据可视化的库,适合用来做图表设计开发,当使用Python与Echarts结合时就产生了Pyecharts.可使用pip安装,默认是 ...

  9. 【Python可视化】超详细Pyecharts 1.x教程,让你的图表动起来~

    前言 pyecharts 是一个用于生成 Echarts 图表的Python库.Echarts是百度开源的一个数据可视化 JS 库,可以生成一些非常酷炫的图表. Pyecharts在1.x版本之后迎来 ...

随机推荐

  1. 树莓派3B搭建NODE-RED运行环境并构建数据流

    树莓派3B搭建NODE-RED运行环境并构建数据流 树莓派搭建Node-RED环境 树莓派自2015年开始是默认就带NODE-RED的,但是如今已是2018年:)自带的版本已经很老了,可通过下面的命令 ...

  2. MySQL的详细讲解

    目录 Mysql的架构与历史 MySQL的逻辑架构 更新中---- Mysql的架构与历史 MySQL的逻辑架构 第二层的架构是所有的跨引擎的功能实现的地方,例如:存储,触发器,视图等. 第三层半酣了 ...

  3. Miller-Rabin and Pollard-Rho

    实话实说,我自学(肝)了两天才学会这两个随机算法 记录: Miller-Rabin 她是一个素数判定的算法. 首先需要知道费马小定理 \[a^{p-1}\equiv1\pmod{p}\quad p\i ...

  4. linux下修改IP地址的方法

    linux下修改IP地址的方法 1.网卡的命名规则 在centos7中,en表示着:ethernet以太网,即现在所用的局域网,enX(X常见有以下3种类型) 2.IP地址的临时修改(重启后失效) 查 ...

  5. 【Spring】重新认识 IoC

    前言 IoC (Inversion of control) 并不是Spring特有的概念. IoC 维基百科的解释: In software engineering, inversion of con ...

  6. CQL和SQL的CRUD操作比较

    数据进行CRUD操作时,CQL语句和SQL语句的异同之处. 1.建表 2.CRUD语句比较 3.总结 1.建表 在此之前先分别创建两张表,插入数据,用来测试然后进行比较 在SQL数据库里面创建表 在C ...

  7. 【UE4 C++ 基础知识】<9> Interface 接口

    概述 简单的说,接口提供一组公共的方法,不同的对象中继承这些方法后可以有不同的具体实现. 任何使用接口的类都必须实现这些接口. 实现解耦 解决多继承的问题 蓝图使用 使用方法 三种调用方法的区别 调用 ...

  8. 6. 站在巨人的肩膀学习Java Filter型内存马

    本文站在巨人的肩膀学习Java Filter型内存马,文章里面的链接以及图片引用于下面文章,参考文章: <Tomcat 内存马学习(一):Filter型> <tomcat无文件内存w ...

  9. 第6次 Beta Scrum Meeting

    本次会议为Beta阶段第6次Scrum Meeting会议 会议概要 会议时间:2021年6月8日 会议地点:「腾讯会议」线上进行 会议时长:15min 会议内容简介:对完成工作进行阶段性汇报:对下一 ...

  10. Nginx高效核心

    Nginx高效核心 目录 Nginx高效核心 Introduction I/O特性 同步/异步 阻塞/非阻塞 常见的I/O模型 阻塞型 非阻塞型 多路复用模型(多路阻塞) 信号驱动模型 异步模型 Ng ...