二十四桥明月夜
 
Powered by Gridea | Theme: Fog
总访问量:  |   访问人数:
Copyright © 2020 备案号: 鄂ICP备...号

luoguP5947 [POI2003]Trinomial 题解

  热度: loading...

前置芝士:

二项式定理

(x+y)n=i=1nCnixiyni(x+y)^n=\sum_{i=1}^nC_n^ix^iy^{n-i}

卢卡斯定理

Lucas(n,m,p)=CnmodpmmodpLucas(n/p,m/p,p)Lucas(n,m,p)=C_{n \bmod p}^{m \bmod p}Lucas(n/p,m/p,p)

颓一下柿子

(x2+x+1)n=((x1)2+3x)n=i=1nCni(x1)2i(3x)ni(x^2+x+1)^n=((x-1)^2+3x)^n=\sum_{i=1}^nC_n^i(x-1)^{2i}(3x)^{n-i}

可以发现除了 Cnn(x1)2nC_n^n(x-1)^{2n} 这一项,其他项系数的因子都有 33

显然是没有意义的

所以只要考虑 (x1)2n(x-1)^{2n} 中第 ii 项的系数

(x1)2n=i=12nC2nixi(1)2ni(x-1)^{2n}=\sum_{i=1}^{2n}C_{2n}^ix^{i}(-1)^{2n-i}

ii 项系数即 C2ni(1)2niC_{2n}^{i}(-1)^{2n-i}

卢卡斯定理求一下就好了

★,°:.☆( ̄▽ ̄)/$:.°★

码风毒瘤莫喷

#include<bits/stdc++.h>
#define R register
#define LL long long
using namespace std;
inline long long read(){
	long long x=0,d=1; char y=getchar();
	while(y<'0'||y>'9'){if(y=='-')d=-1;y=getchar();}
	while(y>='0'&&y<='9'){x=(x<<3)+(x<<1)+(y^'0');y=getchar();}
	return x*d;
}
int k;
LL n,i,fact[4],ny[4];
int Cn(int a,int b){return a>b?0:fact[b]*ny[a]*ny[b-a]%3;}
int lucas(LL a,LL b){return b?lucas(a/3,b/3)*Cn(a%3,b%3)%3:1;}
int main(){
	k=read();
	fact[0]=fact[1]=ny[0]=ny[1]=1;
	fact[2]=ny[2]=2;
	while(k--){
		n=read(); i=read();
		printf("%d\n",(lucas(i,n<<1)*(i%2?-1:1)+3)%3);
	}
	return 0;
}