q-analog 学习笔记(待整修)

联考题考这个♿不会就来学了

首先给出对其的定义。

对于一个对象 \(u\),构造关于 \(q\) 的某表达式 \(f(q)\),使得:

\[\lim_{q\to 1}f(q)=u \]

然而这个可能没有很大用。真正 OI 有用的还是要实际一点。

定义与简单性质

\[[n]_q=\frac{1-q^n}{1-q},[n]_q!=\prod_{i=1}^n[i]_q\\ \binom{n}{m}_q=\frac{[n]_q!}{[m]_q![n-m]_q!} \]

\(f(x)f(qx)f(q^2x)\dots f(q^{n-1}x)\) 记为 \(f^{(n;q)}(x)\),比如

\[(x+y)^{(n;q)}=(x+y)(x+qy)\dots(x+q^{n-1}y) \]

从定义不难看出若干性质。

\[[a+b]_q=[a]_q+q^a[b_q],[ab]_q=[a]_q[b]_{q^a}\\ [-n]_q=-q^{-n}[n_q],[n]_{1/q}=q^{1-n}[n]_q,[n]_{1/q}!=q^{-\binom{n}{2}}[n]_q\\ \binom{n}{k}_{1/q}=q^{-k(n-k)}\binom{n}{k}_q,\binom{n}{k}_q=\binom{n}{n-k}_q\\ \binom{n}{k}_q=\binom{n-1}{k-1}_q+q^k\binom{n-1}{k}_q=q^{n-k}\binom{n-1}{k-1}_q+\binom{n-1}{k}_q\\ \binom{r}{k}_q=(-1)^kq^{kr-\binom{k}{2}}\binom{k-r-1}{k}_q \]

由于

\[\Delta \binom{x}{k}_q=q^{x-k+1}\binom{x}{k-1}_q \]

\[\sum q^{x}\binom{x}{k}_q\delta x=q^k\binom{x}{k+1}_q\\ \sum_{i\le n} q^{x}\binom{x}{k}_q=q^k\binom{n+1}{k+1}_q,\sum_{k=0}^mq^k\binom{r+k}{k}_q=\binom{r+m+1}{m}_q=\sum_{k=0}^mq^{(r+1)(m-k)}\binom{r+k}{k}_q\\ \]

由上面可以得到平行生成函数和上指标生成函数:

\[\sum_{k\ge 0}\binom{m+k+1}{k}_qz^k=\sum_{k\ge 0}z^k\sum_{0\le l\le k}q^l\binom{m+l}{l}\\ =\sum_{l\ge 0}q^l\binom{m+l}{l}\sum_{k\ge l}z^k=\sum_{l\ge 0}q^l\binom{m+l}{l}\frac{z^l}{1-z}\\ =\frac{1}{1-z}\sum_{k\ge 0}(qz)^k\binom{m+k}{k}\\ \therefore \sum_{k\ge 0}\binom{m+k}{k}_qz^k=(1-z)^{(m+1;q)}(\text{recursive proof}) \]

同样,显然

\[\sum_{k\ge 0}\binom{k}{m}_qz^k=z^m(1-z)^{(m+1;q)} \]

最后补两个:

q-三项式定理:

\[\binom{n}{k}_q\binom{k}{r}_q=\binom{n}{r}_q\binom{n-r}{k-r}_q \]

这是很明显的。

q-范德蒙德卷积

\[\sum_k\binom{r}{k}_q\binom{s}{n-k}_qq^{(r-k)(n-k)}=\binom{r+s}{n}_q \]

q-二项式系数的若干其他性质

q-二项式定理及代数证明

\[(x+y)^{(n;q)}=\sum_{k}\binom{n}{k}_qq^{\binom{k}{2}}x^{n-k}y^k \]

证明:

显然只需考虑 \(x=1\)

考察

\[(1+z)^{(n;y)}=F_y(z)=\prod_{i=0}^{n-1}(1+y^iz)\\ F_y(z)=\frac{1+z}{1+y^nz}\prod_{i=0}^{n-1}(1+y^{i+1}z)=\frac{1+z}{1+y^nz}F_y(yz)\\ (1+y^nz)F_y(z)=(1+z)F_y(yz)\\ \sum_{i=0}^nf_iz^i+f_iy^nz^{i+1}=\sum_{i=0}^n f_iy^iz^i+f_iy^iz^{i+1}\\ (1-y^i)f_i=f_{i-1}(y^{i-1}-y^n)\\ f_i=\frac{y^{i-1}-y^n}{1-y^i}f_{i-1} \]

展开,上面每项提取 \(y^{i-1}\) 即证。

又有

\[\frac{1}{1-y}^{(n,q)}=\sum_{i\ge 0}\binom{n+i-1}i_qy^i \]

这个式子在计算排列逆序对数有应用。

不难发现和求出 \([n]_q!\) 的认为 \(q\) 是变量的生成函数前 \(m\) 项等价。(说法不太准确?)

就是需要快速球出 \((1-q)^{(n;q)}\)

根据 q-二项式定理

\[(1-q)^{(n;q)}=\sum_k \binom nk _qq^{\frac{k(k+1)}{2}} \]

利用

\[\binom nk_q=\binom{n}{k-1}_q\frac{1-q^{n-k+1}}{1-q^k} \]

转移即可。

发现只需递推至 \(\sqrt{m}\) 项。复杂度 \(O(m\sqrt m)\)。常数极小。

注意到 \(\exp\) 也可以求这个,但是。。\(\exp\) 常熟实在是太大了。

q-Lucas 定理及代数证明

\(a=\delta_q(p)\) ,即 \(\min(\{a|q^a\equiv 1\pmod p\})\)

Lemma:

\[\forall k\in(0,a),\binom{a}{k}_q\equiv0\pmod p \]

证明:注意到 \([a]_q!=0\)

推论:

\[(1+z)^{(a;q)}\equiv 1+z^a\pmod p \]

证明:

\[(1+z)^{(a;q)}=\sum_k\binom{a}{k}_qq^{\binom{k}{2}}z^k \]

唯一有贡献的是 \(k=0\)\(k=a\),为 \(1\),即证。

q-Lucas Theorem:

\[q^{\binom{m}{2}}\binom{n}{m}_q\equiv\binom{\lfloor n/a\rfloor}{\lfloor m/a\rfloor}q^{\binom{m\bmod a}{2}}\binom{n\bmod a}{m\bmod a}_q\pmod p \]

证明:

\[q^{\binom{m}{2}}\binom{n}{m}_q=[z^m](1+z)^{(n;q)}\\ \equiv [z^m]\left((1+z)^{(a;q)}\right)^{\lfloor n/a\rfloor}(1+z)^{(n\bmod a;q)}\pmod p\\ \equiv [z^m](1+z^a)^{\lfloor n/a\rfloor}(1+z)^{(n\bmod a;q)}\pmod p\\ \equiv \left([z^{\lfloor m/a\rfloor}](1+z)^{\lfloor n/a\rfloor}\right)\left([z^{m\bmod a}](1+z)^{(n\bmod a;q)}\right)\pmod p\\ \binom{\lfloor n/a\rfloor}{\lfloor m/a\rfloor}q^{\binom{m\bmod a}{2}}\binom{n\bmod a}{m\bmod a}_q \]

代数地证明 q-二项式系数为整数

这里先给个分圆多项式定义:

\[\zeta_d=\cos \frac{2\pi d}{n}+i\sin\frac{2\pi d}{n},\gcd(d,n)=1(\iff ord(\zeta_d)=n)\\ \Phi_n(x)=\prod_{(d,n)=1,d\le n}(x-\zeta_d)\\ \]

为了刻画整数 q-模拟,有:

\[\prod_{d|n} \Phi_d(x)=x^n-1\\ \]

证明:

\[RHS=(x-\zeta_1)(x-\zeta_1^2)\dots(x-\zeta_1^n)\\ \because\forall k\in[1,n],ord(\zeta_1^k)\mid n\\ \therefore (x-\zeta_1^k)\mid\prod_{d|n}\Phi_d(x)\\ \therefore (x^n-1)\mid\prod_{d|n}\Phi_d(x)\\ \because \gcd(\Phi_{d_1}(x),\Phi_{d_2}(x))=1,\forall d\mid n,\Phi_d(x)\mid (x^n-1)\\ \therefore \prod_{d|n}\Phi_d(x)\mid(x^n-1) \]

两者均为首一多项式,即证。

Gause Lemma:两个本原多项式的乘积仍然是本原多项式。本原多项式的定义是系数最大公约数为一的多项式。

有:(即分圆多项式系数是整数)

\[\forall n\in\mathbb{N}^+,\Phi_n(x)\in\mathbb{Z}[x] \]

证明:

\(n=1\) 时为 \(x-1\),成立。

归纳,

\[x^n-1=\Phi_n(x)\prod_{d|n,d<n} \Phi_d(x)\\ \]

根据归纳假设, \(\Phi_d(x)\) 为本原多项式,故

\[\prod_{d|n,d<n} \Phi_d(x) \]

为本原多项式。

这个和左项都是首一本原多项式,即证。

那么我们可以证明了!

\[[n]_q=\prod_{d|n,d>1}\Phi_d(q)\\ [n]_q!=\prod_{d\ge 2}\Phi_d(q)^{\lfloor n/d\rfloor} \]

然后我们发现 \(\lfloor n/d\rfloor\ge \lfloor m/d\rfloor+\lfloor(n-m)/d\rfloor\),这样就(类似 \(q\to 1\) 勒让德定理)地完成了证明。

若干组合性质

\[\sum_{p\in P[n]}q^{\tau(p)}=[n]_q! \]

证明:

\(f_i=\operatorname{card}(\{j\mid j<i\ \land \ p_j>p_i\})\),容易发现 \(f\)\(p\) 构成双射。

注意到

\[[i]_q=\frac{q^i-1}{q-1}=\sum_{j=0}^{i-1}q^j \]

那么 \([i]_q=\sum q^{f_i}\),从而原式是显然的。

\[\sum_{p\in S}q^{\operatorname{maj}(p)}=\sum_{p\in S}q^{\tau(p)}=\binom{\sum a_i}{a_1,a_2,\dots,a_n}_q \]

其中 \(S\)\(a_i\)\(i\) 元素(对于所有 \(i\))构成的排列集合。

\[\operatorname{maj}(p)=\sum_{i<\sum a_i}i[p_i>p_{i+1}] \]

我的另一篇博客 证明了前一个等号。(后面这个等号是 trival 的)

\(\mathbb{F}_q^n\)(在模 \(q\) 意义下的 \(n\) 维整数空间)大小为 \(k\) 的线性无关向量组个数。\(q\) 为质数。

不难发现第一次可以选 \(q^n-1\)(不能选 \(\bf{0}\)),第二次 \(q^n-q\)(第一个会 ban 掉 \(q\) 个),如此下去。

记有 \(((n)_k)_q\) 个 ,那么

\[((n)_k)_q=q^{\binom k 2}\prod_{i=n-k+1}^n (q^i-1)=\frac{(q-1)^kq^{\binom k 2}[n]_q!}{[n-k]_q!} \]

不难验证,

\[\binom nk_q=\frac{((n)_k)_q}{((k)_k)_q} \]

特别地, \(k>n\) 时, \(((n)_k)_q=0\)

CF1603F

tourist场切失败

\(\mathbb{F}^k_2\) 中不能线性表出 \(\bf x\) 的大小为 \(n\) 的可重向量组个数。(注意 \(nk\) 和上面反了)

\(\sum k\le 5\times 10^7,n\le10^9\)

\(\bf {x=0}\),那么就是 \(((k)_n)_2\)

否则枚举向量组的极大线性无关组大小 \(r(r\le k)\),问题转化为强制选 \(\bf x\) 的方案数。

显然,每个非 \(\bf 0\) 向量是本质相同的。答案就是 \(\dfrac{((k)_{r+1})_2}{2^k-1}\)

还有 \(n-r\) 个作为被线性表出的。

考虑一开始会表出 \(1\) 个向量,第一个向量会使得 \(2\) 个向量被标出,第二个会有 \(4\) 个向量被表出……

一共就是 \([x^{n-r}](1+x+x^2+\dots)(1+2x+4x^2)\dots\)

就是

\[[x^{n-r}]\frac{1}{1-x}^{(r;2)}=\binom n r_2 \]

对于所有 \(r\)\(O(k)\) 是可以解决的。

使用光速幂。略微卡常。

// Problem: October 18, 2017
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1603F
// Memory Limit: 500 MB
// Time Limit: 4000 ms
// UOB Koala
// 
// Powered by CP Editor (https://cpeditor.org)
#pragma GCC optimize("fast-math","unroll-loops","no-stack-protector")
#pragma GCC diagnostic error "-funsafe-loop-optimizations"
#pragma GCC diagnostic error "-fcse-skip-blocks"
#pragma GCC diagnostic error "-fwhole-program"
#pragma GCC diagnostic error "-std=c++14"
#pragma GCC target("sse3","sse2","sse")
#pragma GCC optimize("Ofast")
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+5,mod=998244353,B=40000,N=1e7;
int qp(int a,int b){
	if(b==0)return 1;
	int T=qp(a,b>>1);T=1ll*T*T%mod;
	if(b&1)return 1ll*T*a%mod;
	return T;
}
#define ll long long
int a[B+5],b[B+5];
int Pow(ll x){
	x%=(mod-1);
	return 1ll*a[x%B]*b[x/B]%mod;
}
int upw[maxn],fac[maxn],ifac[maxn];
int q2(ll n){
	return Pow(n)-1;
}
int C(int n,int k){
	if(k>n-k)k=n-k;
	return 1ll*upw[k]*ifac[k]%mod;
}
int n,k,x,T;
int ask(int n,int k){
	if(k>n)return 0;
	return 1ll*Pow(1ll*k*(k-1)/2)*fac[n]%mod*ifac[n-k]%mod;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	a[0]=1;
	for(int i=1;i<=B;i++)a[i]=1ll*a[i-1]*2%mod;
	b[0]=1;
	for(int i=1;i<=B;i++)b[i]=1ll*b[i-1]*a[B]%mod;
	fac[0]=1;
	for(int i=1;i<=N;i++)fac[i]=1ll*fac[i-1]*q2(i)%mod;
	ifac[N]=qp(fac[N],mod-2);
	for(int i=N-1;i>=0;i--)ifac[i]=1ll*ifac[i+1]*q2(i+1)%mod;
	cin>>T;
	while(T--){
		cin>>n>>k>>x;
		if(x==0){
			cout<<ask(k,n)<<"\n";
		}else{
			upw[0]=1;
			n++;
			for(int i=1;i<=min(n,k);i++)upw[i]=1ll*upw[i-1]*q2(n-i)%mod;
			int ans=0;int A=qp(q2(k),mod-2);
			for(int i=0;i<min(n,k);i++){
				(ans+=1ll*ask(k,i+1)*C(n-1,i)%mod)%=mod;
			}
			ans=1ll*ans*A%mod;
			cout<<ans<<"\n";
		}
	}
	return 0;
}
posted @ 2023-11-25 23:00  British_Union  阅读(53)  评论(0编辑  收藏  举报