NC217043. CCA的小球
描述
输入描述
第一行一个数 n 。第二行 n 个数,分别表示 n 个小球的颜色 。
输出描述
一个数,表示方案数对 10^9+7 取模后的值 。
示例1
输入:
5 2 1 3 3 5
输出:
36
C++(clang++11) 解法, 执行用时: 302ms, 内存消耗: 8212K, 提交时间: 2021-03-13 14:59:41
#include <cstdio> #include <algorithm> #define LL long long using namespace std; const LL mod=1e9+7; LL n,a[1001000],c=0,now; LL qsm(LL a,LL p) { LL base=a,ans=1; while(p) { if (p&1) ans=base*ans%mod; base=base*base%mod; p>>=1; } return ans; } int main() { LL ans=0; scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); sort(a+1,a+n+1); for(int i=2;i<=n;i++) if (a[i]==a[i-1]) c++; now=1; for(int i=2;i<=n;i++) now=now*i%mod; now=now*qsm(qsm(2,c),mod-2)%mod; ans=now; for(int i=0;i<c;i++) { now=now*2ll*(c-i)%mod*qsm((n-i)*(i+1)%mod,mod-2)%mod; if (i&1) ans=(ans+now)%mod; else ans=(ans-now+mod)%mod; } printf("%lld",ans); return 0; }