q-analog 学习笔记(待整修)
联考题考这个♿不会就来学了
首先给出对其的定义。
对于一个对象 \(u\),构造关于 \(q\) 的某表达式 \(f(q)\),使得:
然而这个可能没有很大用。真正 OI 有用的还是要实际一点。
定义与简单性质
把 \(f(x)f(qx)f(q^2x)\dots f(q^{n-1}x)\) 记为 \(f^{(n;q)}(x)\),比如
从定义不难看出若干性质。
由于
有
由上面可以得到平行生成函数和上指标生成函数:
同样,显然
最后补两个:
q-三项式定理:
这是很明显的。
q-范德蒙德卷积
q-二项式系数的若干其他性质
q-二项式定理及代数证明
证明:
显然只需考虑 \(x=1\)。
考察
展开,上面每项提取 \(y^{i-1}\) 即证。
又有
这个式子在计算排列逆序对数有应用。
不难发现和求出 \([n]_q!\) 的认为 \(q\) 是变量的生成函数前 \(m\) 项等价。(说法不太准确?)
就是需要快速球出 \((1-q)^{(n;q)}\)。
根据 q-二项式定理
利用
转移即可。
发现只需递推至 \(\sqrt{m}\) 项。复杂度 \(O(m\sqrt m)\)。常数极小。
注意到 \(\exp\) 也可以求这个,但是。。\(\exp\) 常熟实在是太大了。
q-Lucas 定理及代数证明
令 \(a=\delta_q(p)\) ,即 \(\min(\{a|q^a\equiv 1\pmod p\})\)。
Lemma:
证明:注意到 \([a]_q!=0\)。
推论:
证明:
唯一有贡献的是 \(k=0\) 和 \(k=a\),为 \(1\),即证。
q-Lucas Theorem:
证明:
代数地证明 q-二项式系数为整数
这里先给个分圆多项式定义:
为了刻画整数 q-模拟,有:
证明:
两者均为首一多项式,即证。
Gause Lemma:两个本原多项式的乘积仍然是本原多项式。本原多项式的定义是系数最大公约数为一的多项式。
有:(即分圆多项式系数是整数)
证明:
\(n=1\) 时为 \(x-1\),成立。
归纳,
根据归纳假设, \(\Phi_d(x)\) 为本原多项式,故
为本原多项式。
这个和左项都是首一本原多项式,即证。
那么我们可以证明了!
然后我们发现 \(\lfloor n/d\rfloor\ge \lfloor m/d\rfloor+\lfloor(n-m)/d\rfloor\),这样就(类似 \(q\to 1\) 勒让德定理)地完成了证明。
若干组合性质
证明:
设 \(f_i=\operatorname{card}(\{j\mid j<i\ \land \ p_j>p_i\})\),容易发现 \(f\) 和 \(p\) 构成双射。
注意到
那么 \([i]_q=\sum q^{f_i}\),从而原式是显然的。
其中 \(S\) 是 \(a_i\) 个 \(i\) 元素(对于所有 \(i\))构成的排列集合。
我的另一篇博客 证明了前一个等号。(后面这个等号是 trival 的)
求 \(\mathbb{F}_q^n\)(在模 \(q\) 意义下的 \(n\) 维整数空间)大小为 \(k\) 的线性无关向量组个数。\(q\) 为质数。
不难发现第一次可以选 \(q^n-1\)(不能选 \(\bf{0}\)),第二次 \(q^n-q\)(第一个会 ban 掉 \(q\) 个),如此下去。
记有 \(((n)_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\)
就是
对于所有 \(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;
}