从AtCoder Regular Contest 077D: 11 中学习逆元的线性求法
2017-07-02 17:33
435 查看
有n+1个数,且1~n都出现过,显然有且仅有一个数出现了两次
假设这个数出现的两个位置为p1,p2,其中p1<p2
对于长度k,一共有C(n+1,k)个子序列
如果在p1之前和p2之后的数中挑选k-1个,再与重复的数组合,那么那个子序列就会被多算一次
所以,对于长度k,一共有C(n+1,k)-C(n-p2+p1,k-1)个不重复的子序列
由于需要求组合数对1e9+7取模的值,所以需要1!~n!的逆元(可以看线性逆元求法)
假设这个数出现的两个位置为p1,p2,其中p1<p2
对于长度k,一共有C(n+1,k)个子序列
如果在p1之前和p2之后的数中挑选k-1个,再与重复的数组合,那么那个子序列就会被多算一次
所以,对于长度k,一共有C(n+1,k)-C(n-p2+p1,k-1)个不重复的子序列
由于需要求组合数对1e9+7取模的值,所以需要1!~n!的逆元(可以看线性逆元求法)
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cmath> #include <algorithm> #include <cstdlib> #include <utility> #include <map> #include <stack> #include <set> #include <vector> #include <queue> #include <deque> #define x first #define y second #define mp make_pair #define pb push_back #define LL long long #define ll long long #define Pair pair<int,int> #define LOWBIT(x) x & (-x) using namespace std; const LL MOD=1e9+7; const int INF=0x7ffffff; const int magic=348; int n; LL id1,id2; LL a[100048]; int v[100048]; int cnt[100048]; LL fac[100048],finv[100048],inv[100048]; void make() { fac[0]=fac[1]=1; finv[0]=finv[1]=1; inv[1]=1; for(int i=2;i<100010;i++) { inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD; fac[i]=fac[i-1]* i%MOD; finv[i]=finv[i-1]*inv[i]%MOD; } } ll C(int x,int y) { if(x<y) return 0; return fac[x]*(finv[y]*finv[x-y]%MOD)%MOD; } int main () { LL i; cin>>n; memset(a, 0, sizeof(a)); memset(v, 0, sizeof(v)); for(ll i = 1; i <= n + 1; ++i){ cin >> a[i]; v[a[i]]++; } for(ll i = 1; i <= n + 1; ++i){ if(v[a[i]] == 2 && !id1){ id1 = i; } else if(v[a[i]] == 2) { id2 = i; } } LL ans; make(); for (i=0;i<=n;i++) { ans=C(n+1,i+1); ans-=C(n-id2+id1,i); if (ans<0) ans+=MOD; printf("%d\n",ans); } return 0; }
相关文章推荐
- AtCoder Regular Contest 077-D - 11
- AtCoder Regular Contest 080 F - Prime Flip 线性筛+匈牙利算法
- 暴力——AtCoder Regular Contest 070 #D No need
- Atcoder Regular Contest 072 E Alice in Linear Land
- AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)
- AtCoder Regular Contest 076
- AtCoder Regular Contest 070 D - No Need 想法:利用单调性二分+bitset优化
- AtCoder Regular Contest 069 D - Menagerie 枚举起点 递推
- AtCoder Regular Contest 075 D Widespread
- AtCoder Regular Contest 075
- AtCoder Regular Contest 077-C - pushpush
- AtCoder Regular Contest 058 C (水题)
- AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】
- AtCoder Regular Contest 061 DSnuke's Coloring
- AtCoder Regular Contest 076 F - Exhausted (Hall's marriage theorem 或 贪心)
- AtCoder Regular Contest 069 D
- AtCoder Regular Contest 071 F
- 背包——AtCoder Regular Contest 073 #D
- [霍尔定理] AtCoder Regular Contest 076 F Exhausted?
- AtCoder Regular Contest 076 D Built?(kruskal)