import java.util.Scanner;
public class Main {
public static void main(String[] arg) {
Scanner scanner = new Scanner(System.in);
// todo
}
}
NC205409. L2-3新旷野地带
描述
输入描述
一行三个由空格隔开的正整数 n, m, k,表示新旷野地带由 n 行 m 列组成,手中有 k 个可选择放置的极巨化坑。
输出描述
一行一个整数,表示满足题意的放置方案的数量对取模后的结果。
示例1
输入:
2 2 2
输出:
6
说明:
6 种放置方案如下:C++14(g++5.4) 解法, 执行用时: 366ms, 内存消耗: 8332K, 提交时间: 2020-05-11 16:10:13
#include<bits/stdc++.h>using namespace std;typedef long long ll;ll f[1<<21];const ll mod=1e9+7;ll qpow(ll a,ll b){ll ans=1;while(b){if(b&1) ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;}int main(){int n,m,k;cin>>n>>m>>k;f[0]=1;for(int i=1;i<=1000000;i++) f[i]=f[i-1]*i%mod;ll ans=0;k=min(k,min(n,m));for(int i=1;i<=k;i++){ans+=(f[n]*qpow(f[n-i]*f[i]%mod,mod-2))%mod*(f[m]*qpow(f[m-i]*f[i]%mod,mod-2)%mod)%mod*f[i]%mod;ans%=mod;}cout<<ans;return 0;}
C++11(clang++ 3.9) 解法, 执行用时: 240ms, 内存消耗: 8312K, 提交时间: 2020-09-26 11:14:00
#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=1e9+7;const int N=1e6+10;ll f[N],ans;ll qpow(ll a,ll b){ll res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b=b>>1;}return res;}int main(){f[0]=1;for(int i=1;i<N;i++){f[i]=f[i-1]*(ll)i%mod;}int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=k;i++){if(i>min(n,m)) break;ans=ans+((f[n]*qpow(f[n-i]*f[i]%mod,mod-2)%mod)*(f[m]*qpow(f[m-i],mod-2)%mod))%mod;ans=ans%mod;}printf("%lld\n",ans);return 0;}