G: 聚会
题意:
有n个人,现在有一个聚会,每个人都可以选择参加或者不参加。而参加的人中每个人要么只去送礼物,要么只接受礼物。不存在全部都接受礼物或者全部都送礼物的情况(这样要么没人送礼物,要么没人接受礼物了)。问有多少中情况?
题解:
对于1个人和2个人先特判一下风别为1和3。
其实就是求组合数,对于n>=3时,每次去的人数必定要>=2,并且每个人有送和不送两两种情况求一个2的幂,然后再减去全送和全得2种情况,所以ans=∑C(k,n)*(2^k-2)其中3<=k<=n
然后在求组合数时,对于分母的两个阶层用其逆元表示即可。
这题的模为1e9+7,可以用费马小定理或是线性求阶乘逆元算
#include<iostream>
#include<cstdio>
#include<algorithm>
#define mod 1000000007
#define ll long long
#define M 100005
using namespace std;
ll fac[M];//阶乘
ll fac_inv[M];//阶乘的逆元
ll poww