题面

这个题暴好啊,考了很多东西。

首先设f(x)为离终点还有x步要走的期望步数,我们可以发现 :

1.x>=k时,x可以转移到的点的下标都<x。

2.x<k时,则可能走回到x或者下标更大的点。

因为k特别小,所以我们可以把 f(0) (显然是0),f(1),f(2),.....,f(k-1) 暴力高斯消元出来 (这个你们不会的话可以试着把每个0<x<k的x的等式写出来,然后把f(x)项全移到左边,其他项全移到右边,就可以得到一个方程;这样可以列k-1个方程,正好k-1个未知数,高斯消元模板)。

这样我们就解决了2.情况。于是对于大量1.情况,我们便可以用2.情况推的下标比较小的f() 做矩阵乘法。

所以这就是两个题:先建一个矩阵然后高斯消元,再建一个然后矩阵快速幂,最后再做一次向量乘矩阵就可以得到答案了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=23,ha=1000000007; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;} inline int ksm(int x,int y){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
} int k,inv,Inv,ans;
ll n; struct node{
int a[N][N]; inline void clear(){ memset(a,0,sizeof(a));}
inline void Base(){
clear();
for(int i=0;i<=k;i++) a[i][i]=1;
} node operator *(const node &u)const{
node r; r.clear();
for(int l=0;l<=k;l++)
for(int i=0;i<=k;i++)
for(int j=0;j<=k;j++) ADD(r.a[i][j],a[i][l]*(ll)u.a[l][j]%ha);
return r;
} inline void build(){
clear(),a[k][k]=1; for(int i=1;i<k;i++){
a[i][k]=(i*2>k)?1:k*(ll)Inv%ha,a[i][i]=1; for(int j=1,to;j<=k;j++){
to=i-j;
if(to<0) to=-to;
if(to&&to!=i) ADD(a[i][to],ha-((i*2>k)?inv:Inv));
}
}
} inline void solve(){
for(int i=1,ne;i<k;i++){
for(int j=i;j<k;j++) if(a[j][i]){ ne=j; break;}
if(ne!=i) for(int l=i;l<=k;l++) swap(a[ne][l],a[i][l]); int ni=ksm(a[i][i],ha-2),now;
for(int j=i+1;j<k;j++){
now=ni*(ll)a[j][i]%ha;
for(int l=i;l<=k;l++) ADD(a[j][l],ha-a[i][l]*(ll)now%ha);
}
} for(int i=k-1;i;i--){
for(int j=i+1;j<k;j++) ADD(a[i][k],ha-a[i][j]*(ll)a[j][k]%ha);
a[i][k]=a[i][k]*(ll)ksm(a[i][i],ha-2)%ha;
// printf("%d %d\n",i,a[i][k]);
}
} inline void init(){
clear();
for(int i=k-2;i>=0;i--) a[i+1][i]=1;
for(int i=0;i<k;i++) a[i][k-1]=inv;
a[k][k-1]=1,a[k][k]=1;
}
}A,X,ANS; int main(){
scanf("%lld%d",&n,&k),inv=ksm(k,ha-2),Inv=ksm(k-1,ha-2);
if(k==1){ printf("%d\n",n%ha); return 0;} A.build(),A.solve(),X.init();
n-=k-1,ANS.Base();
for(;n;n>>=1,X=X*X) if(n&1) ANS=ANS*X; for(int i=0;i<=k;i++) ADD(ans,A.a[i][k]*(ll)ANS.a[i][k-1]%ha);
printf("%d\n",ans);
return 0;
}

  

CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)E的更多相关文章

  1. [CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)]飞行棋

    题目链接:https://www.cometoj.com/contest/59/problem/E?problem_id=2714 求期望并且一堆转移基本上就是期望dp了(叉腰 照常的设dp[i]表示 ...

  2. Comet OJ CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)

    Preface 在一个月黑风高的夜晚我这个蒟蒻正踌躇着打什么比赛好 是继续做一场AGC,还是去刷一场CF 然后,一道金光闪过(滑稽),我们的红太阳bzt给我指明了方向: 你太菜了,我知道有一场很水的比 ...

  3. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)D

    题面 一开始想到一个 O(N^2) 做法,先把x排序,然后顺次枚举x最大的点,看向前最多可以保留多少点 (也就是先不管正方形的上下长度限制,先考虑左右的限制).然后再对这些点做一遍类似的..(等等这么 ...

  4. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)F

    题面 F比较友善(相较于E),我们发现如果i和j是满足条件的两个下标,那么: a[i]-2*b[i] + a[j]-2*b[j] >=0 或者 b[i]-2*a[i] + b[j]-2*a[j] ...

  5. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)H

    题面 被神葱安利安利了本题. 我们贪心的想,如果有那么一坨相等的学号,那么肯定是保留一个人学号不变,其余的再推到学号+1的位置(准备与那个位置的其他人合并)处理. 虽然a[i]可大至1e18,不过如果 ...

  6. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)G

    题面 一道暴水的dp....别问我为什么直接打开了G题,我只是对题目名称感兴趣而已.... #include<bits/stdc++.h> #define ll long long usi ...

  7. Comet OJ 夏季欢乐赛 篮球校赛

    Comet OJ 夏季欢乐赛 篮球校赛 题目传送门 题目描述 JWJU注重培养学生的"唱,跳,rap,篮球"能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台 ...

  8. Comet OJ 夏季欢乐赛 Gree的心房

    Comet OJ 夏季欢乐赛 Gree的心房 题目传送门 题目描述 据说每一个走进Gree哥哥心房的小姑娘都没有能够再走出来-- 我们将Gree哥哥的心房抽象成一个n \times mn×m的地图,初 ...

  9. Comet OJ 夏季欢乐赛 分配学号

    Comet OJ 夏季欢乐赛 H 分配学号 题目传送门 题目描述 今天,是JWJU给同学们分配学号的一天!为了让大家尽可能的得到自己想要的学号,鸡尾酒让大家先从 [1,10^{18}][1,1018] ...

随机推荐

  1. k8s遇坑:The connection to the server k8s-api.virtual.local:6443 was refused - did you specify the right host or port?

    k8s坑The connection to the server localhost:8080 was refused - did you specify the right host or port ...

  2. k8s-高可用架构设计

    docker的私有仓库harbor.容器化kubernetes部分组建.使用阿里云日志服务收集日志. 部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题,所以本文档主要适合于那些有一定k ...

  3. web登录的session、cookie和token

    为什么会有登录这回事 首先这是因为HTTP是无状态的协议,所谓无状态就是在两次请求之间服务器并不会保存任何的数据,相当于你和一个人说一句话之后他就把你忘掉了.所以,登录就是用某种方法让服务器在多次请求 ...

  4. javascript头像上传

    上传头像: 相关关键词:ondragover(拖动元素在投放区内移动) ondrop (元素放在投放区触发但是要去处理浏览器默认事件的影响:ondragenter.ondragover) dataTr ...

  5. 微信小程序iOS下拉白屏晃动,坑坑坑

    感觉ios的小程序每个页面都可以下拉出现白屏 有时页面带有滑动的属性会跟着晃动,体验不是很好 解决办法: 先禁止页面下拉 <config> { navigationBarTitleText ...

  6. Windows环境用Xampp自制证书(certificate), Chrome(版本 60.0.3112.90通过)

    标题: Self signed certificate no longer valid as of Chrome 58(Chrome58以后自制证书不再有效)原文地址: https://github. ...

  7. Windows live Writer Tips

    http://lehsys.blogspot.com/2013/03/windows-live-writer-how-to-change.html http://www.carlosag.net/to ...

  8. 2、screen工具

    1.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...

  9. python学习-数据类型

    计算机处理的数据不单纯的指数字,计算机可以处理数字.文本.音频.视频等等各种数据,下面描述的是Python中可以直接使用和处理的基本数据类型.     整数 Python可以处理任意大小的整数,跟ja ...

  10. 微信小程序开发(一)创建一个小程序Hello World!

    开发微信小程序并不是很难,网上有很多小程序开发资料,尤其是微信官方的<小程序开发指南>最详细. 下面是我开发小程序的历程: 第一步,请前往https://mp.weixin.qq.com/ ...