正题

题目链接:https://www.luogu.com.cn/problem/P7116


题目大意

有一个kkk维空间,第iii维长度为wiw_iwi​,有nnn步每一步都是让某个维的坐标+1/−1+1/-1+1/−1,每次走完nnn步都会从111重新走一次,现在求从这个空间的每个点出发走多少步才能走出这个空间的步数的和。

1≤n≤5×1051\leq n\leq 5\times 10^51≤n≤5×105

1≤k≤10,1≤wi≤1061\leq k\leq 10,1\leq w_i\leq 10^61≤k≤10,1≤wi​≤106 或者 1≤k≤3,1≤wi≤1091\leq k\leq 3,1\leq w_i\leq 10^91≤k≤3,1≤wi​≤109


解题思路

求在这一步出去的方案显然很麻烦,所以我们可以考虑对于每步之后求还没出去的起点数然后求个和就一样了。并且每个维度可以在一定程度上分开考虑。

第一轮显然需要特别处理,设li,j,ri,jl_{i,j},r_{i,j}li,j​,ri,j​表示第iii步之后第jjj维的最小位移(非正数)和最大位移,那么这一步不会出去的方案就是∏j=1k(wj−ri,j+li,j)\prod_{j=1}^k (w_j-r_{i,j}+l_{i,j})∏j=1k​(wj​−ri,j​+li,j​),也就是在[1−l,w−r][1-l,w-r][1−l,w−r]这个范围可以存活,这个可以暴力处理。

之后考虑每轮的第iii步的最小/最大位移距离依旧记作li,j,ri,jl_{i,j},r_{i,j}li,j​,ri,j​,之后考虑如何计算每一步多少轮之后会死亡,记作ttt。

首先设aia_iai​表示第一轮维度iii缩小的范围,然后bib_ibi​表示之后每一轮这个维度缩小的范围,那么对于第iii步来说,第jjj个维度的最久存活轮数就是⌊aj−ri,j+li,jbj⌋\lfloor\frac{a_j-r_{i,j}+l_{i,j}}{b_j}\rfloor⌊bj​aj​−ri,j​+li,j​​⌋,算出ttt之后假设如果我们能够枚举轮数的话那么答案应该就是
∑x=1t∏j=1kaj−ri,j+li,j−bjx\sum_{x=1}^t\prod_{j=1}^ka_j-r_{i,j}+l_{i,j}-b_jxx=1∑t​j=1∏k​aj​−ri,j​+li,j​−bj​x
显然可以O(k2)O(k^2)O(k2)暴力乘算得到一个和xxx有关的多项式然后求和。

至于多项式求和我们可以通过∑x=0txj\sum_{x=0}^t x^j∑x=0t​xj带入多项式暴算,可以直接拉插得到,当然这题可以对于k≤3k\leq 3k≤3的情况我们自己手动插多项式算,然后k>3k>3k>3的就直接预处理就好了。

时间复杂度:O(nk2)O(nk^2)O(nk2) 或者 O(nk2+k×max{wi})O(nk^2+k\times max\{w_i\})O(nk2+k×max{wi​})


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10,M=11,P=1e9+7;
ll n,m,ans,pw[M][N*2],l[N][M],r[N][M],w[M],a[M],b[M],e[M],f[M][M];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll calc(ll n,ll k){if(k>3)return pw[k][n];if(k==3)return (n*(n+1)/2%P)*((n*(n+1)/2)%P)%P;if(k==2)return n*(n+1)%P*(2*n+1)%P*((P+1)/6)%P;if(k==1)return n*(n+1)/2%P; return n+1;
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll k=4;k<=m;k++)for(ll i=1;i<=1e6;i++)pw[k][i]=(pw[k][i-1]+power(i,k))%P;ans=1;for(ll i=1;i<=m;i++)scanf("%lld",&w[i]),ans=ans*w[i]%P;for(ll i=1;i<=n;i++){ll c,d;scanf("%lld%lld",&c,&d);e[c]+=d;for(ll j=1;j<=m;j++)l[i][j]=l[i-1][j],r[i][j]=r[i-1][j];l[i][c]=min(l[i][c],e[c]);r[i][c]=max(r[i][c],e[c]);}bool flag=1;for(ll i=1;i<=m;i++)if(e[i]!=0||w[i]-r[n][i]+l[n][i]<=0){flag=0;break;}if(flag)return puts("-1")&0;for(ll i=1;i<=n;i++){ll sum=1;for(ll j=1;j<=m;j++)sum=sum*max(0ll,w[j]-r[i][j]+l[i][j])%P;ans=(ans+sum)%P;}for(ll i=1;i<=m;i++)a[i]=w[i]-r[n][i]+l[n][i];for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){l[i][j]=min(0ll,l[i][j]+e[j]-l[n][j]);r[i][j]=max(0ll,r[i][j]+e[j]-r[n][j]);}for(ll i=1;i<=m;i++)b[i]=r[n][i]-l[n][i];flag=0;for(ll i=1;i<=n;i++){for(ll j=1;j<=m;j++)f[0][j]=0;f[0][0]=1;ll t=1e9+7;for(ll j=1;j<=m;j++){ll x=a[j]-r[i][j]+l[i][j];if(x<=0){flag=1;break;}if(b[j]>0)t=min(t,x/b[j]);for(ll k=0;k<=m;k++){(f[j][k]=f[j-1][k]*x%P)%=P;if(k)(f[j][k]+=f[j-1][k-1]*(P-b[j])%P)%=P;}}if(flag)break;for(ll j=0;j<=m;j++)(ans=ans+f[m][j]*calc(t,j)%P)%=P;}printf("%lld\n",ans);return 0;
}

P7116-[NOIP2020]微信步数【数学】相关推荐

  1. [NOIP2020]微信步数

    微信步数 题解 现在才补一年前的题. 首先我们的考虑一个简单的暴力.然而我考场上连这个暴力都没想到 我们将一个点能走多少步转化一下,通过整体来看. 我们考虑走了这一步后还有多少点能够幸存,即没有走出整 ...

  2. [NOIP2020] 微信步数

    题目描述 小 C 喜欢跑步,并且非常喜欢在微信步数排行榜上刷榜,为此他制定了一个刷微信步数的计划. 他来到了一处空旷的场地,处于该场地中的人可以用 kk 维整数坐标 (a_1, a_2, \ldots ...

  3. NOIP2020微信步数

    先考虑\(O(nkw)\)的30分暴力. 显然,每个维度上走过的位置是一个区间. 只要走的步数确定,那么这个区间关于起点位置的相对位置也就确定了. 只要先算出每个循环向左/右所走的最远距离,以及一个循 ...

  4. 2022-05-05随手更新文章,以及记录一下新的微信步数接口

    本来不想写这个文章的,但好像不写点东西发一下,似乎没法引起大家的注意. 然后最近刚好更新了一下微信步数的API接口,那就顺便也水个文章,露一下脸. 关于微信步数API接口 其实这个也没啥好说的,接口用 ...

  5. 微信步数日历打卡小程序

    微信步数日历打卡小程序 背景 碳达峰.碳中和.垃圾分类.减塑.反食品浪费等绿色低碳生活正日渐成为社会新风尚."低碳生活,绿建未来"活动采取"线上线下"相结合的方 ...

  6. ios11修改微信步数_你会时常去看他的微信步数吗?

    在这个社交的网络圈子里,就算你一言不发,你的轨迹也会被默默地记录. 今天的你,给他的微信步数点赞了吗? 1 小洋和她的男友是异地恋,和其他的异地情侣天天煲电话粥的恋爱方式不同,由于社团工作以及学业压力 ...

  7. uni-app利用uniCloud获取微信步数并将数据写入数据库

    uni-app利用uniCloud获取微信步数并将数据写入数据库 本项目依赖了uni-id 只是毕业设计,想法不完善,没有对用户授权失败做处理,如果编写的时候需要注意 第一步:调用wx.login() ...

  8. 傻瓜式操作更改微信步数

    更改微信运动步数的简单原理 很多网络上面的教程大多是从更改微信的数据库入手,不仅非常麻烦,而且工具不好找. 不妨换一个思路,不去费尽心思更改微信的数据,我们可以更改其他运动APP的数据,再导入到微信运 ...

  9. python刷步数程序设计_乐心健康间接修改微信步数-Docker持久运行python脚本

    使用的就是抓包然后修改数据进行解包,相关的使用方法可以从原博客查看,我这里是进一步补充将脚本持久化运行 想法是从csdn上面发现的一个博客开始的,能够修改微信步数. 缺点就是要一直运行才可以,那干脆扔 ...

  10. 开发笔记 | JAVA获取微信步数+日周月排行榜的实现

    目录 功能描述 微信步数同步 获取我当日的步数 日排行,周排行,月排行榜的实现 功能描述 实现微信步数的同步(也就是获取当前的微信步数更新至数据库) 实现获取我当日的微信步数的查询 实现按照日排行,周 ...

最新文章

  1. 如何用 Python 分析 14 亿条数据?
  2. SNAP实现(转自SuiFei)
  3. python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)
  4. android 开发规范1
  5. [SpringBoot2]自动配置
  6. 《Reids 设计与实现》第九章 事件
  7. 什么是动态链接库(DLL)以及常见问题
  8. python中的异常如何处理
  9. Python中如何打印空行
  10. 深度:余额宝技术架构及演进
  11. 阿里云最新虚拟化研发岗招聘
  12. java 新手入门电子书_Java基础入门电子书.pdf
  13. listview优化方案
  14. 手写字体识别实验-Python课程设计
  15. 抓取日志的小工具(命令)Adb logcat
  16. matlab冲激函数的傅里叶变换,利用MATLAB对正弦,矩形脉冲函数进行傅里叶变换
  17. 自定义原生JS键盘快捷键和vue-hotkey
  18. 微信公众号盈利模式_微信公众号的盈利方式有哪些?
  19. 联想笔记本v110_联想V110系列笔记本如何设置u盘启动教程
  20. varclus变量聚类对变量有啥要求_「SPSS数据分析」SPSS聚类分析(K-均值聚类)软件操作结果解读...

热门文章

  1. php 查询数据是否大于,怎么实现从数据查询数据的时候判断如果数据大于N条分次查询 递归吗?...
  2. linux图形界面鼠标变成小手_加载Linux系统,树莓派变身桌面电脑
  3. 最近有粉丝向我请教Java泛型,于是重温了一下,希望学弟面试顺利
  4. c语言程序设计稀土,稀土掺杂Tarkall-C合金多尺度设计及计算
  5. oracle 如何筛选重复,求sql--筛选A字段相同,B字段不同且不重复的记录
  6. 支付宝 统一支付 php,支付宝APP支付 统一下单 php服务端 tp5
  7. 信管专业c语言考什么,计算机信息管理专业卫生事业单位招聘考试笔试模拟题(十)...
  8. 纯c语言实现的改进暗通道去雾算法测试程序(附赠大量测试图像),基于改进暗通道先验算法的图像去雾...
  9. mysql 错误 0152_SP2-1503 SP2-0152 错误解决
  10. java char short区别_java 彻底理解 byte char short int float long double