线性独立相关概念:https://baike.baidu.com/item/%E7%BA%BF%E6%80%A7%E7%8B%AC%E7%AB%8B
题目描述
设A={0,1},某无聊透顶的神每天从 (即维度为n,每一位由01组成的所有向量的集合)中随机选择一个二进制向量。现在他想知道n天中选取n个线性独立向量的概率。答案输出同该场比赛中
有大Van题的有些许错误的A题相似。其中本题的模数为1e9+7。
输入描述
第一行输入一个T,表示测试样例的数目;
接下来的T行每行输入一个数N。
输出描述
对于每个样例输出一个答案。
样例
- 输入
3
1
2
3 - 输出
500000004
194473671
861464136
说明:
f(1)=
f(2)=
f(3)=
题解思路
这道题目奇葩地牵涉到了向量,所以需要先了解何为线性独立。所谓线性独立,就是每个向量都不共面,即向量之间不能直接通过加减得到。
首先我们可以考虑每个维度分别有多少向量。
不难发现,第一维度仅有0,1这两个向量,而二维则有(0,0),(0,1),(1,0),(1,1)这四个变量……………………以此类推,不难发现第n维共有 个向量。
一通计算猛如虎,发现取i个向量时,对于i,有 个向量不与选择的向量独立。
接下来很容易不难得出,在n维的空间里,选取i个向量各自独立的概率为 ,
所以,
;
看着这一大坨一定很头疼,经化简后却变成了:
晓得了公式,那么打表就不成问题了。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long Mod=1e9+7;
long long m=2,f1[20000055],p1=500000004,p=500000004,f;
int main()
{
f=f1[1]=p;
for(int i=2;i<=20000050;i++)
{
m=m*2%Mod;
p1=p1*p%Mod;
f=f%Mod*(m-1)%Mod*p1%Mod;
f1[i]=f1[i-1]^f;
}
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%lld\n",f1[n]);
}
}
京公网安备 11010502036488号