zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/shenben/p/5648900.html
Copyright © 2011-2022 走看看