题目链接
题解:
因为最后结果对3取模,所以可以在原先的式子上减去 3 x 3x 3x,变为 ( x 2 − 2 x + 1 ) n (x^2-2x+1)^n (x2−2x+1)n,然后可以再化简变成: ( x − 1 ) 2 n (x-1)^{2n} (x−1)2n,
那么第 k k k项系数就是 C 2 n k ∗ ( − 1 ) 2 n − k C_{2n}^k*(-1)^{2n-k} C2nk∗(−1)2n−k,只要讨论 2 n − k 2n-k 2n−k的奇偶性即可,求组合数取模可以用 L u c a s Lucas Lucas算法。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int>pii;
const int MAXN=1e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f;
const int p=73;
ll pow(ll a, ll b, ll m)
{
ll ans = 1;
a %= m;
while(b)
{
if(b & 1)
ans = (ans % m) * (a % m) % m;
b /= 2;
a = (a % m) * (a % m) % m;
}
ans %= m;
return ans;
}
ll inv(ll x, ll p)//x关于p的逆元,p为素数
{
return pow(x, p - 2, p);
}
ll C(ll n, ll m, ll p)//组合数C(n, m) % p
{
if(m > n)
return 0;
ll up = 1, down = 1;//分子分母;
for(int i = n - m + 1; i <= n; i++)
up = up * i % p;
for(int i = 1; i <= m; i++)
down = down * i % p;
return up * inv(down, p) % p;
}
ll Lucas(ll n, ll m, ll p)
{
if(m == 0)
return 1;
return C(n % p, m % p, p) * Lucas(n / p, m / p, p) % p;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
ll ans;
if((2*n-k)%2==0)
{
ans=Lucas(2*n,k,3);
}
else
{
ans=3-Lucas(2*n,k,3);
ans=ans%3;
}
printf("%lld\n",ans);
}
}