前言
因为上海站 被数学控死 所以最近会偏向于数学
思路
n
<
=
1
e
5
,
k
<
=
1
e
5
n<=1e5 ,k<=1e5
n<=1e5,k<=1e5这么大的数怎么算呢 ? 直接暴力求解出来吗
(显然 算法基础课我的那个组合数还是没掌握
但是这题不需要求出值
只需要求出 是否是奇偶性就行,因此我们需要尽可能的将值变小
因此想到卢卡斯定理 :
(
n
m
)
m
o
d
p
=
(
⌊
n
/
p
⌋
⌊
m
/
p
⌋
)
⋅
(
n
m
o
d
p
m
m
o
d
p
)
m
o
d
p
\left(\begin{array}{c}n \\ m\end{array}\right) \bmod p=\left(\begin{array}{l}\lfloor n / p\rfloor \\ \lfloor m / p\rfloor\end{array}\right) \cdot\left(\begin{array}{c}n \bmod p \\ m \bmod p\end{array}\right) \bmod p
(nm)modp=(⌊n/p⌋⌊m/p⌋)⋅(nmodpmmodp)modp
通过每次都 / 2 /2 /2 (log级别了)
我们既可以保证数的范围,又可以保证时间的复杂度
因此我们可以通过最常见的递归实现即可
CODE
int n,m;
int C(int n,int m)
{
if(m == n)
return 1;
if(m == 0)
return 0;
if(n == 0)
return 1;
return C(n/2,m/2)*C(n%2,m%2);
}
void solve()
{
cin>>m>>n;
cout<<C(n,m)%2<<endl;
}
int main()
{
int t;cin>>t;while(t -- )
solve();
return 0;
}