2018.09.28 牛客网contest/197/C期望操作数(状态转移+前缀和递推)
传送门
比赛手动打了四项感觉有规律,调了40min+之后重新手算了后面几项发现只有前四项满足规律233。
首先这道题只跟q−xq-xq−x有关。
我们尝试找找递推关系。
我们令f[i]f[i]f[i]表示区间左右端点之差为i时的期望步数。
那么显然有:
f[0]=f[0]=f[0]=不存在(方便计算可以看做0)
f[1]=(f[0]+f[1])2+1f[1]=\frac {(f[0]+f[1])} {2}+1f[1]=2(f[0]+f[1])+1
f[2]=(f[0]+f[1]+f[2])3+1f[2]=\frac {(f[0]+f[1]+f[2])} {3}+1f[2]=3(f[0]+f[1]+f[2])+1
…
f[k]=∑i=0kf[i]k+1+1f[k]=\frac {\sum_{i=0} ^kf[i]} {k+1}+1f[k]=k+1∑i=0kf[i]+1
接着我们考虑用前k−1k-1k−1项的前缀和sum[k−1]=absum[k-1]=\frac {a}{b}sum[k−1]=ba来推出f[k]f[k]f[k]和sum[k]sum[k]sum[k]。
显然有:
f[k]=sum[k−1]+f[k]k+1+1f[k]=\frac {sum[k-1]+f[k]} {k+1}+1f[k]=k+1sum[k−1]+f[k]+1
=>f[k]∗k=sum[k−1]+k+1f[k]*k=sum[k-1]+k+1f[k]∗k=sum[k−1]+k+1
带入sum[k−1]=a/bsum[k-1]=a/bsum[k−1]=a/b得出:
f[k]∗k=a+b∗(k+1)bf[k]*k=\frac {a+b*(k+1)}{b}f[k]∗k=ba+b∗(k+1)
=>f[k]=a+b∗(k+1)b∗kf[k]=\frac {a+b*(k+1)}{b*k}f[k]=b∗ka+b∗(k+1)
=>sum[k]=ab+a+b∗(k+1)b∗ksum[k]=\frac {a}{b}+\frac {a+b*(k+1)}{b*k}sum[k]=ba+b∗ka+b∗(k+1)
=>sum[k]=(k+1)∗(a+b)b∗ksum[k]=\frac {(k+1)*(a+b)}{b*k}sum[k]=b∗k(k+1)∗(a+b)
由于答案要用逆元,因此我们维护两个前缀数组a[],b[]a[],b[]a[],b[],用a[i]b[i]\frac{a[i]}{b[i]}b[i]a[i]来表示sum[i]sum[i]sum[i]就行了。
于是线性递推出a,ba,ba,b数组就ok了。
注意并不能用线性筛逆元,并且需要时刻维护a,ba,ba,b数组是小于modmodmod的。
p.s.可以用数论知识来证明a,ba,ba,b的取模对答案没有影响,这里就不证了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline ll ksm(ll x,int p){
ll ret=1;
while(p){
if(p&1)ret=ret*x%mod;
x=x*x%mod,p>>=1;
}
return ret;
}
ll a[10000005],b[10000005];
int main(){
a[0]=0,b[0]=1;
for(int i=1;i<=10000000;++i)a[i]=(a[i-1]+b[i-1])*(i+1)%mod,b[i]=b[i-1]*i%mod;
int T;
scanf("%d",&T);
while(T--){
ll l=read(),r=read(),tmp=r-l;
if(!tmp){puts("0");continue;}
printf("%lld\n",(a[tmp-1]+b[tmp-1]*(tmp+1)%mod)%mod*ksm((b[tmp-1]*tmp%mod),mod-2)%mod);
}
return 0;
}
2018.09.28 牛客网contest/197/C期望操作数(状态转移+前缀和递推)的更多相关文章
- 2018.09.28 牛客网contest/197/B面积并(二分+简单计算几何)
传送门 比赛的时候把题目看成求面积交了,一直没调出来. 下来发现是面积并气的吐血. 码了一波发现要开long double. 然而直接用现成的三角函数会挂. 因此需要自己手写二分求角度. 大致思路就是 ...
- 2018.09.28 牛客网contest/197/A因子(唯一分解定理)
传送门 比赛的时候由于变量名打错了调了很久啊. 这道题显然是唯一分解定理的应用. 我们令P=a1p1∗a2p2∗...∗akpkP=a_1^{p_1}*a_2^{p_2}*...*a_k^{p_k}P ...
- 牛客网第二场Jfarm(随机化+二维前缀和)
链接:https://www.nowcoder.com/acm/contest/140/J 来源:牛客网 White Rabbit has a rectangular farmland of n*m. ...
- 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)
题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅
链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...
- 牛客网 2018年东北农业大学春季校赛 I题 wyh的物品
链接:https://www.nowcoder.com/acm/contest/93/I 来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒空间限制:C/C++ 262144K,其他语言5242 ...
- 2018年牛客网NOIP赛前训练营游记
2018年牛客网NOIP赛前训练营游记 提高组(第一场) 中位数 #include<cstdio> #include<cctype> #include<climits&g ...
- 牛客网国庆集训派对Day6 题目 2018年
链接:https://www.nowcoder.com/acm/contest/206/A来源:牛客网 Birthday 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576 ...
随机推荐
- redis该怎么用
最近一些人在介绍方案时,经常会出现redis这个词,于是很多小伙伴百度完redis也就觉得它是一个缓存,然后项目里面把数据丢进去完事,甚至有例如将实体属性拆分塞进redis hash里面的奇怪用法等等 ...
- location 对象属性
Location 对象属性 hash 返回一个URL的锚部分 host 返回一个URL的主机名和端口 hostname 返回URL的主机名 href 返回完整的URL pathname 返回的URL路 ...
- J2SE 8的输入输出--序列化
1. 普通序列化 implements Serializable 继承Serializable接口 class Employee implements Serializable { private S ...
- as3 TweenMax TweenLite方法
as3 TweenMax TweenLite方法补充(暂停.重新播放.倒序播放).现在来好好的学习一下: TweenLite.to(mc, 1.5, {x:100}); 里面的mc指所作用的对象, ...
- as3 判断移动方向
var oldX:Number; stage.addEventListener(MouseEvent.MOUSE_DOWN,downF); stage.addEventListener(MouseEv ...
- UI5-文档-2.3-使用SAPUI5工具为Eclipse开发应用程序
用于为简单用例开发应用程序.用于Eclipse的SAPUI5应用程序开发工具提供向导来支持您以一种简单的方式创建应用程序.使用application project向导,将自动创建包含视图和控制器的必 ...
- Swift 4 新特性
多行字符串 /// 多行字符串用三引号括起来 let quotation = """ The White Rabbit put on his spectacles. &q ...
- 面向对象三大特性一一多态(polymorphism)
package com.bjsxt.oop.polymorphism; public class Animal { public void voice(){ System.out.println(&q ...
- 30分钟新手git教程
本文转载自:http://igeekbar.com/igeekbar/post/82.htm Git近些年的火爆程度非同一般,这个版本控制系统被广泛地用在大型开源项目(比如Linux),不同规模的团队 ...
- 1Java语言概述——重拾Java
1.1 Java 语言诞生 Java 是1995 年 由 Sun公司开发的革命性编程语言. 1.2 Java 的特点 序号 主题 描述 1 简单 比C++简单 2 面向对象 基于对象的编程更符合人的思 ...