質問の説明
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;
}