zoukankan      html  css  js  c++  java
  • 2019.01.27-bzoj4870: [Shoi2017]组合数问题

    题目描述:

    算法标签:递推式,矩阵优化dp

    思路:

    感觉遇到组合数相加式子都可以仔细观察一下他的递推关系,求出递推式后把项与项的关系放到矩阵里,快速幂处理一下就结束了。

    以下代码:

    #include<bits/stdc++.h>
    #define il inline
    #define LL long long
    #define _(d) while(d(isdigit(ch=getchar())))
    using namespace std;
    const int N=55;
    int n,p,k,r;
    struct mat{
        int f[N];
    }a,b;
    il int read(){
       LL x,f=1;char ch;
       _(!)ch=='-'?f=-1:f;x=ch^48;
       _()x=(x<<1)+(x<<3)+(ch^48);
       return f*x;
    }
    il int mu(int x,int y){
        if(x+y>=p)return x+y-p;
        return x+y;
    }
    il mat C(mat x,mat y){
        mat z;
        for(int i=0;i<k;i++)z.f[i]=0;
        for(int i=0;i<k;i++)for(int j=0;j<k;j++)
            z.f[(i+j)%k]=mu(z.f[(i+j)%k],1ll*x.f[i]*y.f[j]%p);
        return z;
    }
    int main()
    {
        n=read();p=read();k=read();r=read();
        a.f[0]++;a.f[1%k]++;
        for(int i=0;i<k;i++)b.f[i]=a.f[i];
        LL y=1ll*n*k-1ll;
        while(y){
            if(y&1ll)a=C(a,b);
            b=C(b,b);y>>=1ll;
        }
        printf("%d
    ",a.f[r]);
        return 0;
    }
    View Code
  • 相关阅读:
    linux之uniq
    shell之sort
    tr命令的使用
    AWK 简明教程
    Word Frequency
    10亿个数中选出最大的100个数
    代理模式(也称委托模式)
    java内存相关
    Two Sum
    Java的集合
  • 原文地址:https://www.cnblogs.com/Jessie-/p/10328693.html
Copyright © 2011-2022 走看看