https://www.cometoj.com/contest/59/problem/E?problem_id=2714

思路:高斯消元求dp[1]~dp[k-1];然后利用递推式矩阵快速幂求出dp[d];

#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstdio>
//#include<bits/stdc++.h>
using namespace std;#define sfi(i) scanf("%d",&i)
#define sfs(i) scanf("%s",(i))
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define fl() printf("flag\n")
#define MOD(x) ((x%mod)+mod)%mod
#define endl '\n'
#define pb push_back
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)//---------------------------------------------------------
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;//gp_hash_table<string,int>mp2;
//__gnu_pbds::priority_queue<int>q;//因为放置和std重复,故需要带上命名空间
//__gnu_pbds::priority_queue<int,greater<int>,pairing_heap_tag> pq;//最快
//----------------------------------------------------------/*
//----------------------------------------------------------
const int BufferSize = 1 << 16;
char buffer[BufferSize], *head, *tail;
inline char Getchar() {if (head == tail) {int l = fread(buffer, 1, BufferSize, stdin);tail = (head = buffer) + l;}return *head++;}
inline ll read() {ll x = 0, f = 1;char c = Getchar();for (;!isdigit(c);c = Getchar()) if (c == '-') f = -1;for (;isdigit(c);c = Getchar()) x = x * 10 + c - '0';return x * f;}
//----------------------------------------------------------
*/const int maxn=2e6+9;
const ll mod=1e9+7;ll power(ll x,ll n)
{ll ans=1;while(n){if(n&1) ans=ans*x%mod;n>>=1;x=x*x%mod;}return ans;
}ll n,d,k;struct M
{ll a[23][23];void init(){mem(a,0);}void Base(){init();for(int i=0;i<=23;i++) a[i][i]=1;}
};M Mmul(M x,M y)
{M res;res.init();int n=k+1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){res.a[i][j]=res.a[i][j]+(x.a[i][k]*y.a[k][j])%mod;res.a[i][j]%=mod;}}}return res;
}M Mpower(M x,ll n)
{M res;res.Base();while(n){if(n&1) res=Mmul(res,x);x=Mmul(x,x);n>>=1;}return res;
}ll A[110][110],x[110];
void Guass(ll n,ll m,ll A[][110])//有n个未知数,m个方程
{ll i=1,j=1,k,r,c;while(i<=m && j<=n)//正在处理第i个方程,解第j个未知数{r=i;//找到绝对值最大的系数,防止除数为0的情况,使得其他方程组系数不会变得太大for(k=i+1;k<=m;k++)if(A[k][j]>A[r][j])r=k;if(A[r][j]>0)//出现为0的情况,说明此项已经被消掉了,直接用进行下一个未知数,而方程不变,不过这个时候,一般来说跳过的这个元素就没有固定解啦{for(c=1;c<=n+1;c++)swap(A[i][c],A[r][c]);//交换for(k=i+1;k<=m;k++)if(A[k][j]>0){ll f=A[k][j]*power(A[i][j],mod-2)%mod;for(c=j;c<=n+1;c++)//当前方程j前面的系数都是0A[k][c]=(A[k][c]-f*A[i][c]%mod+mod)%mod;}i++;//获取下一个方程}j++;//去消下一个未知数}for(ll i=n;i>=1;i--){for(j=i+1;j<=n;j++)A[i][n+1]=(A[i][n+1]-A[i][j]*x[j]%mod+mod)%mod;x[i]=A[i][n+1]*power(A[i][i],mod-2)%mod;//cout<<i<<" "<<x[i]<<endl;}
}int main()
{//FAST_IO;//freopen("input.txt","r",stdin);cin>>d>>k;ll kk=power(k,mod-2);n=k-1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i+j<=k){if(j<i){A[i][j]=MOD(2*kk);}else if(j>i){A[i][j]=kk;}else A[i][j]=MOD(kk-1);}else{if(j<i){A[i][j]=kk;}else if(j>i){A[i][j]=0;}else A[i][j]=MOD(-1);}}A[i][n+1]=MOD(-1);}/*for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cout<<A[i][j]<<" ";}cout<<endl;}*/Guass(n,n,A);M ans;ans.Base();M tmp;tmp.init();for(int i=1;i<=k;i++) tmp.a[1][i]=kk;tmp.a[1][k+1]=1;for(int i=2;i<=k;i++){tmp.a[i][i-1]=1;}tmp.a[k+1][k+1]=1;ans=Mpower(tmp,d-k+1);//fl();M xx;xx.init();for(int i=1;i<=k;i++){xx.a[i][1]=x[i];}xx.a[k+1][1]=1;ans=Mmul(ans,xx);cout<<ans.a[1][1]<<endl;return 0;
}

CCPC-Wannafly Comet OJ 夏季欢乐赛(2019) 飞行棋相关推荐

  1. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)比赛总结

    CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)比赛总结 总结: ​ 这场比赛不太顺心,B,I水题 10分钟内A了.A题推公式用double写卡了1个小时,换成其他暴力 ...

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

    感觉自己代码能力好弱啊 T1 完全k叉树 传送门 Solution 首先特判一下K=1K=1K=1 然后处理出最大满KKK叉树,设这棵树的深度为rankrankrank,根节点的深度为000,这个时候 ...

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

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

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

    题面 这个题暴好啊,考了很多东西. 首先设f(x)为离终点还有x步要走的期望步数,我们可以发现 : 1.x>=k时,x可以转移到的点的下标都<x. 2.x<k时,则可能走回到x或者下 ...

  5. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E.飞行棋(期望dp+矩阵快速幂)

    题目 飞行棋的规则如下: 1.每名玩家有一个棋子,每个回合可以掷一次骰子. 2.如果使用的骰子为 k面,则这 k面上的点数分别为 1,2,3,-,k,且掷得每种点数的概率均为​. 3.如果当前回合掷得 ...

  6. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)部分题解

    茶颜悦色 题意 固定kkk的矩形,能最多框住多少个点. 题解 假如我们固定一个矩形,以左下角为坐标. 这样子对于(a,b)(a,b)(a,b),那么能够包括到这个点的矩形左下角的范围: x∈(a−k, ...

  7. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)A——完全k叉树

    题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球"的篮球协会,更奇特的是--让人耳目一新的攀树协 ...

  8. A 完全k叉树(CCPC-Wannafly Comet OJ 夏季欢乐赛(2019))

    题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球"的篮球协会,更奇特的是--让人耳目一新的攀树协 ...

  9. 完全k叉树(CCPC-Wannafly Comet OJ 夏季欢乐赛(2019) A)

    题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球"的篮球协会,更奇特的是--让人耳目一新的攀树协 ...

最新文章

  1. HDU 3584 Cube (三维树状数组)
  2. ASP.NET MVC 4 过滤器(Authorize)
  3. ASP.NET会员注册登录模块(MD5加密,Parameters防止SQL注入,判断是否注册)
  4. eclipse插件大全整理学习
  5. 支持百万级TPS,Kafka是怎么做到的?
  6. stm32采集脉冲信号_基于STM32+FPGA的数据采集系统的设计与实现
  7. [vb]SendMessageA函数
  8. Android Studio控制台输出乱码,编译时期输出乱码,outpot乱码解决
  9. 如何让Win10 新建txt文档, 默认格式UTF-8
  10. (杂谈)攻击者与开发者的无形碰撞--逻辑漏洞的挖掘实战及反思(一)
  11. tensorflow各个版本的CUDA以及Cudnn版本对应关系
  12. java微信登录认证
  13. 使用 vimdiff 比较文件的技巧
  14. matlab半小提琴图,matplotlib – 分开的小提琴图的一半,以比较尾部数据
  15. android锁屏原理(一)
  16. 语音智能小车:语音识别模块LD3320+STMF103
  17. 程序员趣图:有时候我的代码就是这样子……
  18. python之bt种子,dht网络共享热门资源
  19. 医疗软件开发解决方案
  20. 帝国模板本地安装测试时显示“不支持mysql数据”

热门文章

  1. 前端搜索关键字突出展示
  2. 前田约翰《简单法则》十条
  3. IDEA去除重复代码黄色下滑波浪线提示
  4. python 获取年份_如何从Pythondate时间对象中提取年份?
  5. ElasticSearch的学习笔记并整合SpringBoot做测试
  6. C++程序设计案例实训教程第8章
  7. linux下CUPS学习心得
  8. 新手站长:成功申请Godaddy域名退款到支付宝全过程
  9. 计算机命令vty是什么意思,华为交换机基础命令中user interface 0和user-interface vty 0的区别...
  10. Java 中的大根堆和小根堆