【JZOJ5335】【NOIP2017提高组模拟】早苗(DP、矩阵乘法)
来源:互联网 发布:网络小精灵国语版58网 编辑:程序博客网 时间:2024/05/31 00:39
Description
Solution
这题的DP其实很显然。
首先显然有一个状态是f[i][j]表示做到第i个,向前最多连续j个不同的方案数。
我们既然不能有m个不同的,那么我们只要不向m转移就好了。
转移也是比较的显然首先可以新加一个颜色f[i][j]–>f[i+1][j+1]*(m-j)
或者可以把前面的连续j个颜色断开f[i][j]–>f[i+1][1~j-1]
然后用矩阵乘法。
Code
#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int mo=1e9+7;ll i,j,k,l,t,n,m,ans;struct node{ ll a[107][107]; node friend operator*(node x,node y){ int i,j,k;node z;memset(z.a,0,sizeof(z.a)); fo(i,1,100){ fo(k,1,100){ fo(j,1,100){ z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo; } } } return z; }}a,b;node qsm(node x,ll y){ node z;memset(z.a,0,sizeof(z.a));int i;fo(i,1,m)z.a[i][i]=1; for(;y;y/=2,x=x*x)if(y&1)z=z*x; return z;}int main(){// freopen("fan.in","r",stdin); scanf("%lld%lld",&n,&m); fo(i,1,m-1){ if(i+1!=m)b.a[i][i+1]=m-i; fo(j,1,i)b.a[i][j]=1; } a.a[1][1]=m; a=a*qsm(b,n-1); fo(i,1,m-1)ans=(ans+a.a[1][i])%mo; printf("%lld\n",ans);}
阅读全文
1 0
- 【JZOJ5335】【NOIP2017提高组模拟】早苗(DP、矩阵乘法)
- 【jzoj5335】【NOIP2017提高A组模拟8.24】【早苗】【矩阵乘法快速幂】
- 【JZOJ5335】【NOIP2017提高A组模拟8.24】早苗
- jzoj5335 【NOIP2017提高A组模拟8.24】早苗 (递推优化矩乘)
- NOIP2017模拟赛 k-斐波(数学+欧几里得+矩阵乘法)
- 算法提高 矩阵乘法 (区间dp)
- jzoj5336 【NOIP2017提高A组模拟8.24】提米树 (dfs序dp,奇异姿势dp)
- 【NOIP2017提高A组模拟8.24】早苗
- JZOJ5377. 【NOIP2017提高A组模拟9.19】开拓 DP
- 【JZOJ5336】【NOIP2017提高模拟】提米树(DP、前缀和)
- 蓝桥杯 算法提高 矩阵乘法 (区间dp)
- 【NOIP2016提高A组模拟9.24】天使的分裂 (矩阵乘法)
- 【NOIP2016提高A组模拟7.15】斐波那契数列(矩阵乘法)
- 算法提高 矩阵乘法 区间DP
- 蓝桥杯 算法提高 矩阵乘法 区间dp
- 【GDOI2018模拟7.12】B 矩阵乘法+dp
- NOIP2017提高组模拟赛4 (总结)
- NOIP2017提高组模拟赛5 (总结)
- demo6,记住密码提示框,总结
- 【NOIP2017提高A组模拟8.24】早苗
- spring+maven基本配置
- SSM框架下的注册验证
- 端口号的理解
- 【JZOJ5335】【NOIP2017提高组模拟】早苗(DP、矩阵乘法)
- HDU 33蛇形填数
- Viewpage+小圆点
- dsu on tree
- activiti表结构讲解
- C++ set
- Flash builder 编译编译提示java heap space解决方法
- 小波变换
- [JZOJ5336] 提米树