2021牛客寒假算法基础集训营6 B.系数(卢卡斯定理)

题意:

在这里插入图片描述
在这里插入图片描述

解法:

f ( x ) % 3 = ( x 2 + x + 1 ) n = ( ( x − 1 ) 2 + 3 x ) n 由 于 3 x % 3 = 0 , 因 此 f ( x ) = ( x − 1 ) 2 n 第 k 项 的 系 数 为 C ( 2 n , k ) ∗ ( − 1 ) 2 n − k 因 为 可 以 % 3 , C ( 2 n , k ) 用 卢 卡 斯 定 理 算 一 下 就 行 了 . f(x)\%3=(x^2+x+1)^n \\ =((x-1)^2+3x)^n \\ 由于3x\%3=0,\\ 因此f(x)=(x-1)^{2n} \\ 第k项的系数为C(2n,k)*(-1)^{2n-k}\\ 因为可以\%3,C(2n,k)用卢卡斯定理算一下就行了. f(x)%3=(x2+x+1)n=((x1)2+3x)n3x%3=0,f(x)=(x1)2nkC(2n,k)(1)2nk%3,C(2n,k).

code:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=3e5+5;
const int mod=3;
int c[3][3];
int n,k;
void init(){
    
    
    for(int i=0;i<3;i++){
    
    
        c[i][0]=1;
        for(int j=1;j<=i;j++){
    
    
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
        }
    }
}
int C(int n,int m){
    
    
    if(m<0||m>n)return 0;
    return c[n][m];
}
int lucas(int n,int m){
    
    
    if(m==0)return 1;
    return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
void solve(){
    
    
    cin>>n>>k;
    int ans=lucas(2*n,k);
    if((2*n-k)&1)ans=(-ans+mod)%mod;
    cout<<ans<<endl;
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    init();
    int T;cin>>T;
    while(T--){
    
    
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/114100403