链接:https://ac.nowcoder.com/acm/problem/20808
来源:牛客网
题目描述
小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为1,2,…N,同时小b也想出去游玩。由于一些特殊♂原因,他们的旅行计划必须满足一些条件
首先,他们可以从这N个景点中任意选几个游玩
设小a选出的景点集合为A,小b选的景点集合为B,则需要满足
1. A,B的交集不能为空集
2. A,B不能相互包含(A=B也属于相互包含)
注意:在这里我们认为(A,B)是无序的,即(A,B)和(B,A)是同一种方案
输入描述:
一个整数N表示景点的数量
1<=n<=10^13;
输出描述:
一个整数表示方案数,答案对10^8+7取模
输入
3
输出
3
说明
合法的方案如下:
小a:(1, 2) 小b: (2, 3)
小a:(1, 3) 小b: (2, 3)
小a:(1, 2) 小b: (1, 3)
题解
A和B要满足:
1. A,B的交集不能为空集
2. A,B不能相互包含(A=B也属于相互包含)
那么A和B就应该满足既有相同的元素,又有不同的元素。那么A和B这两个集合每一个都最少有两个元素,最多有n-1个
先枚举A中的元素,然后枚举A和B相同的元素,再枚举不属于A但属于B的元素
得到下边这个公式,然后用二项式定理化简:
公式里有除法操作,那么用逆元来算。公式推导过程不难。
代码
#include<algorithm>
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll mod=1e8+7;
ll ksm(ll a,ll b){
a%=mod;
ll ans=1;
while(b){
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main(){
ll n;
cin>>n;
ll ans=((ksm(4,n)-1-ksm(3,n+1)+mod)%mod*ksm(2,mod-2)+3*ksm(2,n-1))%mod;
cout<<ans<<endl;
return 0;
}