C 言語 - 蘭橋杯 2013 第 4 回本試験問題 - 式の評価

質問の説明

n、m、kを入力し、次の式の値を出力します。
 

このうち C_n^m は組み合わせ数であり、n 人の集合から m 人を選択して集合を構成する選択肢の数を示します。組み合わせ数の計算式は次のとおりです。

入力フォーマット

入力の最初の行には整数 n が含まれ、2 行目には整数 m が含まれ、3 行目には整数 k が含まれます。

データのスケールと規則:
データの 100% について、n は 10 進法で 1000 桁を超えません。つまり、1 ≤ n < 10^1000、1 ≤ k ≤ 1000、および 0 ≤ m ≤ n、k ≤ n です。
ヒント:
999101 は素数です。n
桁が多い場合、ほとんどの場合、答えは 0 ですが、評価時に答えが 0 でないデータが選択されることがあります。

出力フォーマット

上式の値を計算し、答えが非常に大きいので、この値を999101で割った余りを出力してください。 

サンプル入力

3
1
3

サンプル出力

162
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mod=999101;
ll C(ll n,ll m)//组合数 
{
    if(n<n-m)
    n=n-m;
    ll ans=1;
    for(int i=m+1;i<=n;i++)    ans*=i;
    for(int i=1;i<=n-m;i++)    ans/=i;
    return ans;
}
int main()
{
    ll n,m,k,ans=0;
    scanf("%lld%lld%lld",&n,&m,&k);
//    if(n>2*pow(10,10))
//    {
//        printf("0\n");
//        return 0;
//    }
    for(int i=0;i<=n;i++)
    {
        ll temp=(ll)pow(i,k);
        ans+=(C(n,i)%mod*C(n,m)%mod*temp%mod)%mod;
        ans%=mod;
    }
    printf("%lld",ans);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Joy19981127/article/details/135425138
Recomendado
Clasificación