• 1137 计算系数


    1137 计算系数

     数论or递推

    2011年NOIP全国联赛提高组

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    给定一个多项式(ax + by)^k,请求出多项式展开后x^n y^m项的系数。

    输入描述 Input Description

    共一行,包含 5 个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。

    输出描述 Output Description

    输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。

    样例输入 Sample Input

    1 1 3 1 2

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    数据范围
    对于 30%的数据,有0≤k≤10;
    对于 50%的数据,有a = 1,b = 1;
    对于 100%的数据,有0≤k≤1,000,0≤n, m≤k,且n + m = k,0≤a,b≤1,000,000。

    题解:杨辉三角+快速幂+同余与模算术

    思想版:

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1001
    #define mod 10007
    int a,b,k,n,m;
    long long f[N][N];
    long long quick_pow(long long x,long long n){ 
        if(n==0) return 1;
        else{
            while((n&1)==0){
                n>>=1;
                x=(x*x)%mod;
            }    
        }
        long long result=x;
        n>>=1;
        while(n!=0){
            x=(x*x)%mod;
            if((n&1)!=0){
                result=(result*x)%mod;
            }
            n>>=1;
        }
        return result;
    }
    void init(){
        for(int i=0;i<=k;i++) f[i][0]=f[i][i]=1;
        for(int i=2;i<=k;i++){
            for(int j=1;j<i;j++){
                f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;
            }
        }
    }
    int main(){
        scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
        init();
        long long t=f[k][k-n];
        long long t1=quick_pow(a,n);
        long long t2=quick_pow(b,m);
        long long ans=((t%mod*t1%mod)%mod*(t2%mod))%mod;
        printf("%lld
    ",ans);
        return 0;
    } 

    递推版:

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1100
    #define mod 10007
    int f[N][N];
    int a,b,k,n,m;
    int main(){
        scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
        a%=mod;
        b%=mod;
        f[1][0]=a;
        f[1][1]=b;
        for(int i=2;i<=k;i++){
            for(int j=0;j<=i&&j<=m;j++){
                f[i][j]=f[i-1][j]*a%mod;
                if(j)
                    f[i][j]=(f[i][j]+f[i-1][j-1]*b)%mod;
            }
        }
        printf("%d
    ",f[k][m]);
        return 0;
    }
  • 相关阅读:
    英语发音-自然拼读法
    最小二乘法
    BZOJ 1650 [Usaco2006 Dec]River Hopscotch 跳石子
    洛谷 1803 凌乱的yyy
    【模板】矩阵加速(数列)
    【模板】矩阵快速幂
    洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通
    洛谷 1276 校门外的树(增强版)
    BZOJ 1468 Tree 【模板】树上点分治
    洛谷 1501 [国家集训队]Tree II BZOJ 2631 Tree
  • 原文地址:https://www.cnblogs.com/shenben/p/5648900.html
Copyright © 2020-2023  润新知