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 ...
随机推荐
- spring 注解 @NotBlank and BingResult
@NotEmpty用在集合类上面 @NotBlank 用在String上面 @NotNull 用在基本类型上 在 user对象中需要
- leetcode748
public class Solution { public string ShortestCompletingWord(string licensePlate, string[] words) { ...
- 3.mybatis实战教程(mybatis in action)之三:实现数据的增删改查
转自:https://blog.csdn.net/tangruyi1992/article/details/52583910 前面已经讲到用接口的方式编程.这种方式,要注意的一个地方就是.在User. ...
- Delphi XE6打电话
procedure TPhoneDialerForm.btnMakeCallClick(Sender: TObject); var PhoneDialerService: IFMXPhoneDiale ...
- JPQL和SQL的比较
前言 在JAVA EE中,JPQL是专门为Java 应用程序访问和导航实体实例设计的.Java Presistence Query Language(JPQL),java持久性查询语言.它是JPA规范 ...
- mysql insert on duplicate key, update, ignore
insert 语句中不能使用where,所以如果需要根据插入的数据在已有的数据库表是否重复做一些操作可以使用下面三种方法: 1. 使用insert,捕获duplicate错误 2. insert in ...
- Social media users of the world unite!
Social media users of the world unite!全世界社交媒体用户联合起来!If Plato were alive today, he might well regard ...
- ant使用备忘
ant是一个脚本构建工具,可能就是持续集成里面所需要的构建工具. 如果使用eclipse,里面会自带有ant工具,不需要再安装了,创建一个build.xml(或者其他的名字都可以),使用ant来运行就 ...
- MongoDB 数据库命令
数据库命令 连接成功后,默认使用test数据库 查看当前数据库名称 db 查看所有数据库名称,列出所有在物理上存在的数据库 show dbs 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建 ...
- linux下set命令的参数及用法
linux set 命令 功能说明:设置shell. 语 法:set [+-abCdefhHklmnpPtuvx] 补充说明:用set 命令可以设置各种shell选项或者列 出shell变量.单个选 ...