ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

系数 题解(lucas+思维)

2021-02-26 12:34:11  阅读:234  来源: 互联网

标签:3x 题目 lucas 题解 0y 系数 2n define


题目链接

题目思路

这个题目的关键就是 答案模3

要利用这个来突破

令\(y=x^2+x+1\)

则\(y^n=(y+3x)^n\)

因为\((y+3x)^n=C_n^0y^n+C_n^1y^{n-1}(3x)^1+C_n^2y^{n-2}(3x)^2.....\)

显然只有\(C_n^0y^n\mod 3\ne 0\)

那么就可以得证

则\((x^2-2x+1)^n=(x-1)^{2n}\)

那么\(ans=C_{2n}^k(-1)^{2n-k}\)

\(C_{2n}^k\)使用lucas求解

时间复杂度\(O(tlog_3^n)\)

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=3e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
ll n,k;
ll fac[4];
ll cal(ll a,ll b){
    if(a<b) return 0;
    else    return fac[a]/fac[b]/fac[a-b]%3;
}
ll lucas(ll a,ll b){
    if(b==0) return 1;
    return lucas(a/3,b/3)*cal(a%3,b%3)%3;
}
signed main(){
    fac[0]=1;
    for(int i=1;i<=3;i++){
        fac[i]=fac[i-1]*i;
    }
    int _;scanf("%d",&_);
    while(_--){
        scanf("%lld%ld",&n,&k);
        ll ans=lucas(2*n,k);
        if(k%2==1) ans=(-ans+3)%3;
        printf("%lld\n",ans);
    }
    return 0;
}

标签:3x,题目,lucas,题解,0y,系数,2n,define
来源: https://www.cnblogs.com/hunxuewangzi/p/14451650.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有