标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。