【jzoj5215】【BZOJ4870】【Shoi2017】【GDOI2018模拟7.9】【组合数问题】【矩阵快速幂】
2017-07-09 16:26
459 查看
题目大意
解题思路
暴力60分没毛病。r
code
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LF double #define LL long long #define ULL unsigned LL #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 max(LL x,LL y){return (x>y)?x:y;} LL min(LL x,LL y){return (x<y)?x:y;} LL const mk=50+9,inf=1e18+7; LL n,p,K,r,ans[mk][mk],mat[mk][mk],tmp[mk][mk]; void multansmat(){ fo(i,0,K-1)fo(j,0,K-1)tmp[i][j]=0; fo(i,0,K-1)fo(j,0,K-1)fo(k,0,K-1)tmp[i][k]=(tmp[i][k]+ans[i][j]*mat[j][k])%p; fo(i,0,K-1)fo(j,0,K-1)ans[i][j]=tmp[i][j]; } void multmatmat(){ fo(i,0,K-1)fo(j,0,K-1)tmp[i][j]=0; fo(i,0,K-1)fo(j,0,K-1)fo(k,0,K-1)tmp[i][k]=(tmp[i][k]+mat[i][j]*mat[j][k])%p; fo(i,0,K-1)fo(j,0,K-1)mat[i][j]=tmp[i][j]; } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%lld%lld%lld%lld",&n,&p,&K,&r); ans[0][0]=1; fo(i,0,K-1)mat[i][i]++,mat[i][(i+1==K)?0:i+1]++; LL nk=n*K; while(nk){ if(nk&1)multansmat(); multmatmat(); nk>>=1; } printf("%lld",ans[0][r]); return 0; }
相关文章推荐
- 【JZOJ 5215】【GDOI2018模拟7.9】组合数问题
- 【JZOJ5215】【GDOI2018模拟7.9】组合数问题
- [BZOJ4870][SHOI2017]组合数问题 DP+矩阵快速幂
- 【BZOJ4870】[Shoi2017]组合数问题 动态规划(矩阵乘法)
- BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法
- bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]
- BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】
- bzoj4870 [Shoi2017]组合数问题(dp+矩阵倍增)
- 【GDOI2018模拟7.9】组合数问题
- BZOJ 4870 [Shoi2017] 组合数问题
- 【jzoj5078】【GDOI2017第三轮模拟day2】【魔法咒语】【ac自动机】【矩阵快速幂】
- [bzoj4870] [Shoi2017]组合数问题
- 【GDOI2018模拟7.9】组合数问题
- BZOJ4870: [Shoi2017]组合数问题
- bzoj 4870: [Shoi2017]组合数问题 动态规划
- bzoj 4870: [Shoi2017]组合数问题
- bzoj4870 [Shoi2017]组合数问题
- BZOJ 4870: [Shoi2017]组合数问题 (递推+矩阵快速幂)
- BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法