SPOJ 27268 VECTAR5

来源:互联网 发布:proteus单片机仿真教程 编辑:程序博客网 时间:2024/06/10 20:08

Description
给出一个集合S={1,2,…,n},问从S中选取两个子集A,B使得A不是B的子集,B也不是A的子集
Input
第一行一整数T表示用例组数,每组用例输入一整数n表示一个集合S={1,2,…,n}(1<=T<=1e5,1<=n<=1e6)
Output
输出方案数,结果模1e9+7
Sample Input
2
4
8
Sample Output
110
52670
Solution
这里写图片描述
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 1111111#define mod 1000000007ll f2[maxn],f3[maxn];void init(){    f2[0]=f3[0]=1;    for(int i=1;i<maxn;i++)f2[i]=2ll*f2[i-1]%mod,f3[i]=3ll*f3[i-1]%mod;}int main(){    init();    int T,n;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        ll ans=f2[n]*(f2[n]+1)%mod-2ll*f3[n]%mod;        ans=(ans%mod+mod)%mod;        printf("%lld\n",ans);    }       return 0;}
原创粉丝点击