【jzoj5335】【NOIP2017提高A组模拟8.24】【早苗】【矩阵乘法快速幂】
2017-08-24 11:39
441 查看
description
solution
设f[i][j]表示到第i天,往前j天不同的方案数,可以转移到f[i+1][k],当k<=j时系数是1,当k==j+1时系数是m-j,当然要保证j!=m,可以发现这时可以用矩阵乘法快速幂解决的。
code
#include<set> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LL long long #define fo(i,j,k) for(LL i=j;i<=k;i++) #define fd(i,j,k) for(LL i=j;i>=k;i--) #define fr(i,j) for(LL i=begin[j];i;i=next[i]) using namespace std; LL const mm=100+9,mo=1e9+7; LL n,m,lim,ans[mm][mm],mat[mm][mm],tmp[mm][mm]; void multansmat(){ fo(i,1,lim)fo(j,1,lim)tmp[i][j]=0; fo(i,1,lim)fo(j,1,lim)fo(k,1,lim)tmp[i][k]=(tmp[i][k]+ans[i][j]*mat[j][k])%mo; fo(i,1,lim)fo(j,1,lim)ans[i][j]=tmp[i][j]; } void multmatmat(){ fo(i,1,lim)fo(j,1,lim)tmp[i][j]=0; fo(i,1,lim)fo(j,1,lim)fo(k,1,lim)tmp[i][k]=(tmp[i][k]+mat[i][j]*mat[j][k])%mo; fo(i,1,lim)fo(j,1,lim)mat[i][j]=tmp[i][j]; } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%lld%lld",&n,&m);lim=m; fo(i,1,m-1){ fo(j,1,i)mat[i][j]=1; mat[i][i+1]=m-i; } ans[1][1]=m; n--; while(n){ if(n&1)multansmat(); multmatmat(); n>>=1; } LL anss=0; fo(i,1,m-1)anss=(anss+ans[1][i])%mo; printf("%lld",anss); return 0; }
相关文章推荐
- 【JZOJ5335】【NOIP2017提高组模拟】早苗(DP、矩阵乘法)
- jzoj5335 【NOIP2017提高A组模拟8.24】早苗 (递推优化矩乘)
- 【JZOJ5335】【NOIP2017提高A组模拟8.24】早苗
- jzoj5336 【NOIP2017提高A组模拟8.24】提米树 (dfs序dp,奇异姿势dp)
- JZOJ5381. 【NOIP2017提高A组模拟9.21】传送蛋糕
- [JZOJ5402]【NOIP2017提高A组模拟10.8】God Knows (口胡)
- JZOJ 5385. 【NOIP2017提高A组模拟9.23】Carry
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- 【JZOJ4929】 【NOIP2017提高组模拟12.18】B
- JZOJ 5389. 【NOIP2017提高A组模拟9.26】解梦
- JZOJ 5177. 【NOIP2017提高组模拟6.28】TRAVEL
- 【jzoj5289】【NOIP2017提高组A组模拟8.17】【偷笑】【数据结构】
- 【JZOJ 5394】【NOIP2017提高A组模拟10.5】Ping
- 【jzoj5359】【NOIP2017提高A组模拟9.12】【Arrays and Palindrome】
- JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore
- 【JZOJ 5400】【NOIP2017提高A组模拟10.7】Repulsed
- JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
- JZOJ 4921. 【NOIP2017提高组模拟12.10】幻魔皇
- 5334. 【NOIP2017提高A组模拟8.24】空