[JZOJ5335] 早苗
来源:互联网 发布:网络专业课程 编辑:程序博客网 时间:2024/06/10 09:56
题目描述
分析
早上做题拉肚子…死都想不出来怎么做。
我们首先注意到不同的神风没有什么不同,就是说,我们只要知道他们是不同,而没有必要知道他们到底是哪几种。
那么设f[i][j]表示到第i天,第i-j+1~i天的神风各不相同(i-j天为这几天出现过的某个点),只要
用矩阵乘法优化一下就行了。
代码
#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<set> using namespace std;typedef long long ll;typedef double db;#define fo(i,j,k) for(i=j;i<=k;i++)#define fd(i,j,k) for(i=j;i>=k;i--)const int N=105,mo=1e9+7,mx=1e9;int a[N][N],b[N][N],c[N][N],f[N],g[N],ans,i,j,k,m;ll n;void ksm(ll x){ fo(i,0,m) a[i][i]=1; while (x) { if (x&1) { fo(i,0,m) fo(j,0,m) c[i][j]=0; fo(i,0,m) fo(j,0,m) fo(k,0,m) c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%mo; fo(i,0,m) fo(j,0,m) a[i][j]=c[i][j]; } x>>=1; fo(i,0,m) fo(j,0,m) c[i][j]=0; fo(i,0,m) fo(j,0,m) fo(k,0,m) c[i][j]=(c[i][j]+1ll*b[i][k]*b[k][j])%mo; fo(i,0,m) fo(j,0,m) b[i][j]=c[i][j]; }}int main(){ freopen("t2.in","r",stdin);// freopen("t2.out","w",stdout); scanf("%lld %d\n",&n,&m); fo(i,0,m-2) b[i][i+1]=m-i; fo(i,1,m-1) fo(j,1,i) b[i][j]=1; f[0]=1; ksm(n); fo(i,0,m-1) { fo(j,0,m-1) g[i]=(g[i]+1ll*a[j][i]*f[j])%mo; ans=(ans+g[i])%mo; } printf("%d\n",ans);}
阅读全文
0 0
- [JZOJ5335] 早苗
- 【JZOJ5335】【NOIP2017提高组模拟】早苗(DP、矩阵乘法)
- 【JZOJ5335】【NOIP2017提高A组模拟8.24】早苗
- 【jzoj5335】【NOIP2017提高A组模拟8.24】【早苗】【矩阵乘法快速幂】
- jzoj5335 【NOIP2017提高A组模拟8.24】早苗 (递推优化矩乘)
- 【NOIP2017提高A组模拟8.24】早苗
- C++ Primer 第三章 字符串、向量和数组
- UVALive7015(bfs求最短路)
- Hbase伪分布式快速安装+shell简单访问
- Python 代码分析工具:PyChecker、Pylint,简解
- Node.Js
- [JZOJ5335] 早苗
- 计算机系统概论
- 产品工程源代码调试之关注点1
- Linux用户组及用户的管理
- 多线程——worker-master模式
- 【Linux学习笔记】7:命令搜索命令whereis与which
- 百度瓦片地图制作
- IntentService和Service的区别
- 289. Game of Life