题意
求 f ( x ) = ( x 2 + x − 1 ) n f(x)=(x^2+x-1)^n f(x)=(x2+x−1)n的第 k k k项系数
答案对 3 3 3取余
观察数据范围,可以想到应该是 O ( l o g ) O(log) O(log)一次的询问
应该不是什么多项式(可能)
假如能用二项式定理,第 k k k项系数可以用组合数表示出来
但是这里不能用二项式定理,因为里面有三项
但是我们可以变形一下!!
( x 2 − 2 x + 1 ) n (x^2-2x+1)^n (x2−2x+1)n的系数和 f ( x ) f(x) f(x)完全相同
因为我们只是加上了 3 x 3x 3x的倍数,模 3 3 3意义下是一样的
变成这样之后,括号内是一个完全平方的形式
( x − 1 ) 2 n (x-1)^{2n} (x−1)2n
第 k k k项就是 C 2 n k ( − 1 ) 2 n − k x k C_{2n}^k(-1)^{2n-k}x^{k} C2nk(−1)2n−kxk
卢卡斯搞一搞就好了
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=3;
int t,n,k,fac[2001];
int quick(int x,int n)
{
int ans = 1;
for( ; n ; n>>=1,x=x*x%mod )
if( n&1 ) ans = ans*x%mod;
return ans;
}
int C(int n,int m)
{
if(m>n) return 0;
return fac[n]*quick(fac[m],mod-2)%mod*quick(fac[n-m],mod-2)%mod;
}
int Lucas(int n,int m)
{
if(!m) return 1ll;
return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
}
signed main()
{
fac[0]=1;
for(int i=1;i<=2000;i++) fac[i]=(fac[i-1]*i)%mod;
cin >> t;
while( t-- )
{
cin >> n >> k;
int ans = Lucas(2*n,k)*quick(-1,2*n-k);
cout << ( ans%mod+mod )%mod << endl;
}
}