P7116-[NOIP2020]微信步数【数学】

正题

题目链接: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^51n5×105

1≤k≤10,1≤wi≤1061\leq k\leq 10,1\leq w_i\leq 10^61k10,1wi106 或者 1≤k≤3,1≤wi≤1091\leq k\leq 3,1\leq w_i\leq 10^91k3,1wi109


解题思路

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

第一轮显然需要特别处理,设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(wjri,j+li,j),也就是在[1−l,w−r][1-l,w-r][1l,wr]这个范围可以存活,这个可以暴力处理。

之后考虑每轮的第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}\rfloorbjajri,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=1tj=1kajri,j+li,jbjx
显然可以O(k2)O(k^2)O(k2)暴力乘算得到一个和xxx有关的多项式然后求和。

至于多项式求和我们可以通过∑x=0txj\sum_{x=0}^t x^jx=0txj带入多项式暴算,可以直接拉插得到,当然这题可以对于k≤3k\leq 3k3的情况我们自己手动插多项式算,然后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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[2019CSP-S Day1]提高组Day1题解(格雷码[模拟(k转二进制取反的做法带证明)] + 括号树[DP] + 树上的数(暴力+菊花图+单链))

Day1T1&#xff1a;格雷码题目题解代码实现T2&#xff1a;括号树题目题解代码实现T3&#xff1a;树上的数题目10pts暴力题解代码实现25pts菊花图题解代码实现25pts单链题解代码实现T1&#xff1a;格雷码 题目 通常&#xff0c;人们习惯将所有 n位二进制串按照字典序排列&…

模板:环套树

文章目录前言解析找环代码练习环套树的直径代码thanks for reading&#xff01;前言 环套树者&#xff0c;一个环套一棵树也 解析 定义&#xff1a;n个点&#xff0c;n条边的无向连通图 其实就是树多了一条边&#xff0c;连出了一个环 性质&#xff1a;如果对环套树进行dfs&am…

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

在上一篇文章使用PerfView监测.NET程序性能&#xff08;三&#xff09;&#xff1a;分组中&#xff0c;我们使用了Perfview的分组功能。分组功能旨在对某些函数按照某个格式进行分组&#xff0c;以减少视图中的各种无关函数的数量。但仅有分组还不够&#xff0c;有时我们想将一…

P1352 没有上司的舞会

P1352 没有上司的舞会 题意&#xff1a; 给你一个树&#xff0c;每个点都有权值&#xff0c;选择一些点使得权值和最大&#xff0c;要求父亲节点和子节点不能同时选择 题解&#xff1a; 经典树形dp dp[x][0]表示以x为根的子树&#xff0c;且x不参加舞会的最大快乐值 dp[x][…

基础字符串

初三巨佬djwj233 基础字符串

CF536C-Tavas and Pashmaks【凸壳】

正题 题目链接:https://codeforces.com/contest/536/problem/C 题目大意 nnn个人&#xff0c;第iii个人的游泳速度sis_isi​&#xff0c;跑步速度是rir_iri​。如果跑道长度是RRR&#xff0c;泳道长度是SSS那么一个人的用时就是RriSsi\frac{R}{r_i}\frac{S}{s_i}ri​R​si​S​…

带旋treap概念及模板,带例题:普通平衡树

带旋Treap二叉查找树BST(Binary Search Tree)定义Treap定义模板合集&#xff08;均为O(logn)O(logn)O(logn)&#xff09;push_up模板旋转模板插入模板删除模板查找前驱模板查找后驱模板查找键值key模板查找节点的修正值rank模板PS&#xff1a;rd的比较问题例题&#xff1a;普通…

微服务系列实践 .NET CORE

从事这个行业转眼已经6年了&#xff0c;从当初刚毕业的在北京朝八晚十&#xff0c;从二环到五环&#xff0c;仍每天精力充沛的小愤青&#xff1b;再到深圳一点一滴的辛勤在软件行业的耕种&#xff0c;从当初单体应用架构到现在微服务架构的经历&#xff0c;回想起来自己的收获倒…

P2607 [ZJOI2008]骑士

P2607 [ZJOI2008]骑士 题意&#xff1a; n个点n个边&#xff0c;每个点都有权值&#xff0c;相邻的点不能同时选择&#xff0c;问如何选择能使得权值最大 题解&#xff1a; 这个题很有P1352 没有上司的舞会这个题的感觉&#xff0c;唯一的区别是那个题保证是树&#xff0c;…

模板:线段树优化建图

前言 百川到海&#xff0c;天下归一 解析 线段树优化建图是用于对一个区间的点连边时的优化方法 建一棵in树一棵出树分别往上和下指即可 大概长这样 &#xff08;pia的洛谷的照片&#xff09; 建树 正常动态开点即可 void build(int &k,int l,int r){tr[ktot](tree){0…

Binary Search

01 分数划分 什么 01 分数划分&#xff0c;叫 Binary Search 多好。 P1642 规划 可以二分答案 \(x\)&#xff0c;考虑选择 \(n-m\) 个数使得答案 \(\ge x\)。 \[\dfrac{\sum w(i)}{\sum c(i)}\ge x \]\[\sum w(i)\ge \sum (x\times c(i)) \]\[\sum(w(i)-x\times c(i))\ge 0 \]之…

CF1556F-Sports Betting【状压dp,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/CF1556F 题目大意 nnn个点的一张竞赛图&#xff0c;每个点有一个权值aia_iai​&#xff0c;(i,j)(i,j)(i,j)之间的边iii连jjj的概率是aiaiaj\frac{a_i}{a_ia_j}ai​aj​ai​​&#xff0c;否则jjj连iii。 现在期望有多少个点…

[非旋平衡树]fhq_treap概念及模板,例题:普通平衡树,文艺线段树

文章目录概念全套模板push_up模板split拆树模板(按权值拆)split拆树模板(按个数拆)merge合并模板&#xff08;地址版&#xff09;merge合并模板&#xff08;带返回根&#xff09;区间模板insert插入模板delete删除模板find_kth找第k大模板get_rank找排名模板pre找前驱模板suf找…

P4381 [IOI2008]Island

P4381 [IOI2008]Island 题意&#xff1a; 给你一棵基环树森林&#xff0c;求出基环树的直径之和. 题解&#xff1a; 对于基环树,我们将环看作根,那么直径有两种情况:: 1.不经过环,也就是环上某个点的子树内部,对于这种情况,直接在子树内部处理直径,更新答案即可; 2.经过环…

20210912模拟

文章目录总结复盘总结 190pts 50403070 今天吸取了昨天的教训&#xff0c;没有再像之前一样先死磕一道题&#xff0c;把命运押在切题上&#xff0c;整体时间分配还算合理 要认真审题&#xff01; 今天T1少看了条件&#xff0c;T4一开始看错题意浪费了时间… 复盘 先看题 乍…

surging 微服务引擎 1.0 正式发布

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用&#xff0c;服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心&#xff0c;集成了哈希一致性&#xff0c;随机&#xff0c;轮询、压力最小优先作为负载均衡的算法&#xff0c;底…

CF1594F-Ideal Farm【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF1594F 题目大意 给出n,s,kn,s,kn,s,k&#xff0c;求是否所有的长度为nnn且和为sss的正整数序列都有一段和为kkk的区间。 1≤T≤105,1≤n,s,k≤10181\leq T\leq 10^5,1\leq n,s,k\leq 10^{18}1≤T≤105,1≤n,s,k≤1018 解题…

P4178 Tree

P4178 Tree 题意&#xff1a; 给定一棵 n 个节点的树&#xff0c;每条边有边权&#xff0c;求出树上两点距离小于等于 k 的点对数量。 题解&#xff1a; 点分治的模板题是求等于K的路径条数 本题是求小于等于K的路径条数&#xff0c;我们只需要改变统计答案即可 原本统计答…

YBTOJ:彩色圆环

文章目录前言题目描述InputOutputSample InputSample Output解析代码前言 尽信书&#xff0c;则不如无书 题目描述 Input 仅有一行&#xff0c;该行给出依次两个正整数N, M&#xff0c;分别表示宝石的个数和宝石在变化时可能变成的颜色种类数。 Output 应仅有一行&#xff0…

【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记

文章目录T1&#xff1a;数字游戏题目CODET2&#xff1a;公交换乘题目CODET3&#xff1a;纪念品题目题解CODET4&#xff1a;加工领奖题目题解CODE关于普及组的想法&游记T1&#xff1a;数字游戏 题目 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏&…