求问是否有一种算法能在线性以下时间复杂度以下求出以下问题:
现有p个1和q个0,在这(p+q)个数中随机取任意个使得异或值为1,求方案数。
昨天问了一下,据说可以用线性基,但调了好久无果。但明显有以下算法可以完成:
#include<bits/stdc++.h>
using namespace std;
const long long Moder=1e9+7;
int main()
{
for(j=2;j<=m;j++)
{
for(k=1;k<=j;k+=2)
{
if(k>p)
{
break;
}
if(j-k>q)
{
continue;
}
ans+=(C(p,k)*C(q,j-k))%Moder;
}
}
return 0;
}
很显然这个玩意的时间复杂度为O(N2)
所以我想问一下能否减少时间复杂度(很显然这是一个数学式子,但我不会化简so...)
调了4π小时了...
Respect