摆(行列式、杜教筛)

这篇具有很好参考价值的文章主要介绍了摆(行列式、杜教筛)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有一个 n × n n\times n n×n 的矩阵 A A A,满足:
A i , j = { 1 i = j 0 i ≠ j ∧ i ∣ j C otherwise A_{i,j}=\begin{cases} 1 &i=j\\ 0 &i\not=j\land i\mid j\\ C &\text{otherwise} \end{cases} Ai,j= 10Ci=ji=jijotherwise

det ⁡ ( A ) \det(A) det(A)。答案模 998244353 998244353 998244353

n ≤ 1 0 11 n\le10^{11} n1011


显然当 C = 0 C=0 C=0 时答案为 1 1 1,当 C = 1 C=1 C=1 时若 n ≤ 2 n\le2 n2 则答案为 1 1 1 否则为 0 0 0

首先 A A A 形如:
[ 1 0 0 0 0 … C 1 C 0 C … C C 1 C C … C C C 1 C … C C C C 1 … ⋮ ⋮ ⋮ ⋮ ⋮ ⋱ ] \begin{bmatrix} 1&0&0&0&0&\dots\\ C&1&C&0&C&\dots\\ C&C&1&C&C&\dots\\ C&C&C&1&C&\dots\\ C&C&C&C&1&\dots\\ \vdots&\vdots&\vdots&\vdots&\vdots&\ddots \end{bmatrix} 1CCCC01CCC0C1CC00C1C0CCC1

考虑把主对角线的 1 1 1 换位 C + x C+x C+x,这样 det ⁡ ( A ) \det(A) det(A) 就可看做关于 x x x 的多项式,求值只需代入 x = 1 − C x=1-C x=1C 即可。

这里有个式子

det ⁡ ( A ) = ∑ S ⊂ { 1 , 2 , … , n } det ⁡ ( B S ) ⋅ x n − ∣ S ∣ \det(A)=\sum\limits_{S\subset\{1,2,\dots,n\}}\det(B_S)\cdot x^{n-|S|} det(A)=S{1,2,,n}det(BS)xnS

其中 B S B_S BS 表示把矩阵 A A A 主对角线元素换成 C C C,只选出行列都在 S S S 中的元素拼接形成的矩阵。

例如: B { 1 , 2 , 4 , 5 , 8 } = [ C 0 0 0 0 C C 0 C 0 C C C C 0 C C C C C C C C C C ] B_{\{1,2,4,5,8\}}=\begin{bmatrix} C&0&0&0&0\\ C&C&0&C&0\\ C&C&C&C&0\\ C&C&C&C&C\\ C&C&C&C&C\\ \end{bmatrix} B{1,2,4,5,8}= CCCCC0CCCC00CCC0CCCC000CC

证明考虑感性理解。设 i = n − ∣ S ∣ i=n-|S| i=nS,对于 x i x^{i} xi 的系数,考虑行列式的定义,要选出行列都互不相同的 n n n 个数相乘,由于只有主对角线上的 C + x C+x C+x 有次数贡献,于是考虑选出来 m m m 个主对角线上的元素( m ≥ i m\ge i mi),剩下的行列拼接在一起后面选。我们此时发现 n − m + m − i = n − i n-m+m-i=n-i nm+mi=ni,说明 B S B_S BS 是由 S S S 的行列与 m m m 行列之中选 m − i m-i mi 个组成的, ( C + x ) m (C+x)^m (C+x)m x i x^i xi 的系数为 ( m i ) C m − i \binom{m}{i}C^{m-i} (im)Cmi,恰好满足条件。

我们观察 B S B_S BS,发现如果 S S S 中元素两两整除,那么 B S B_S BS 是下三角矩阵, det ⁡ ( B S ) = C ∣ S ∣ \det(B_S)=C^{|S|} det(BS)=CS。否则可以证明 det ⁡ ( B S ) = 0 \det(B_S)=0 det(BS)=0

考虑归纳法证明,如果 S S S 中存在两个数不为 S S S 中其他任何数的因子,那么矩阵中就会出现两行 C C C det ⁡ ( B S ) = 0 \det(B_S)=0 det(BS)=0;否则 S S S 中最大的数一定是其他数的倍数,从而只有最后一行全为 C C C,不妨删去最后一行列。这样递归下去,容易发现结论成立。

r = C 1 − C r=\frac{C}{1-C} r=1CC,于是 det ⁡ ( A ) = ( 1 − C ) n ∑ S 中元素两两整除 r ∣ S ∣ \det(A)=(1-C)^n\sum\limits_{S中元素两两整除} r^{|S|} det(A)=(1C)nS中元素两两整除rS

f i f_i fi 表示所有满足 S S S 中最大元素为 i i i r ∣ S ∣ r^{|S|} rS 之和(特别地, f 1 = 1 + r f_1=1+r f1=1+r)。容易得到转移式子
f i = r ∑ j ∣ i , j < i f j f_i=r\sum\limits_{j\mid i,j<i}f_j fi=rji,j<ifj

s ( i ) = ∑ j = 1 i f j s(i)=\sum\limits_{j=1}^if_j s(i)=j=1ifj,我们要求出 s ( n ) s(n) s(n)

考虑杜教筛,我们构造 g ( n ) = { − 1 n = 1 r n > 1 g(n)=\begin{cases}-1&n=1\\r&n>1\end{cases} g(n)={1rn=1n>1,函数 h = f ∗ g h=f*g h=fg,容易验证 h ( n ) = { − r − 1 n = 1 0 n > 1 h(n)=\begin{cases}-r-1&n=1\\0&n>1\end{cases} h(n)={r10n=1n>1。套用公式 g ( 1 ) s ( n ) = ∑ i = 1 n h i − ∑ i = 2 n g ( i ) s ( ⌊ n i ⌋ ) g(1)s(n)=\sum\limits_{i=1}^nh_i-\sum\limits_{i=2}^ng(i)s(\lfloor\frac ni\rfloor) g(1)s(n)=i=1nhii=2ng(i)s(⌊in⌋),可以得到 s ( n ) s(n) s(n) 的转移式子
s ( n ) = 1 + r + r ∑ i = 2 n s ( ⌊ n i ⌋ ) s(n)=1+r+r\sum\limits_{i=2}^ns(\lfloor\frac ni\rfloor) s(n)=1+r+ri=2ns(⌊in⌋)

到此直接按式子求答案是 O ( n 3 4 ) O(n^{\frac34}) O(n43) 的,如果预处理出前 n 2 3 n^{\frac23} n32 s ( n ) s(n) s(n),求值可以做到 O ( n 2 3 ) O(n^{\frac23}) O(n32)

但是预处理时间复杂度容易带上 log ⁡ \log log,所以要考虑优化。

n = ∏ p i k i n=\prod p_i^{k_i} n=piki,如果我们把 p 1 , p 2 , … p_1,p_2,\dots p1,p2, 依次换成 2 , 3 , 5 , 7 , … 2,3,5,7,\dots 2,3,5,7,,所得到的数设为 n ′ n' n,容易发现 f n = f n ′ f_n=f_{n'} fn=fn。这启发我们 f n f_n fn 的值只与可重集 k k k 有关。通过暴力发现可重集的数量很少,于是我们可以暴力求出这些“代表”的函数值,然后让找到其他数所对应的“代表”。用欧拉筛实现,具体实现可参照代码。

总的时间复杂度为 O ( n 2 3 ) O(n^{\frac23}) O(n32)文章来源地址https://www.toymoban.com/news/detail-827002.html

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353,N=2e7+1;
ll n,c,R;
int a[N],p[N],cnt,m,to[N],num[N],Max[N];
ll S[N];
unordered_map<ll,int> ma;
ll ksm(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
ll s(ll n)
{
    if(n<=m) return S[n];
    if(ma.count(n)) return ma[n];
    ll ans=1+R;
    for(ll i=2,r;i<=n;i=r+1){
        r=n/(n/i);
        ans=(ans+(r-i+1)%mod*R%mod*s(n/i))%mod;
    }
    return ma[n]=ans;
}
void init(int n)
{
    a[1]=1,to[1]=S[1]=1+R;
    for(int i=2;i<=n;i++){
        if(!a[i]){
            p[++cnt]=i;
            to[i]=2;
            num[i]=1;
            Max[i]=i;
        }
        if(to[i]==i){
            for(int j=1;j*j<=i;j++) if(i%j==0) S[i]=(S[i]+S[j]+(j*j<i&&j>1)*S[i/j])%mod;
            S[i]=S[i]*R%mod;
        }
        else S[i]=S[to[i]];
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            int x=i*p[j];
            a[x]=1;
            Max[x]=Max[i];
            if(i%p[j]==0){
                num[x]=num[i];
                to[x]=to[x/Max[x]]*p[num[x]];
                break;
            }
            num[x]=num[i]+1;
            to[x]=to[x/Max[x]]*p[num[x]];
        }
    }
    for(int i=2;i<=n;i++) S[i]=(S[i]+S[i-1])%mod;
}
int main()
{
    freopen("bigben.in","r",stdin);
    freopen("bigben.out","w",stdout);
    cin>>n>>c;
    if(!c) cout<<1,exit(0);
    if(c==1) cout<<(n<=2),exit(0);
    R=c*ksm(1-c+mod,mod-2)%mod;
    init(m=min(n,N-1));
    cout<<s(n)*ksm(1-c+mod,n)%mod;
}

到了这里,关于摆(行列式、杜教筛)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数笔记1-二阶行列式和三阶行列式

    本笔记记录自B站《线性代数》高清教学视频 “惊叹号”系列 宋浩老师第一课 有2行2列,4个元素 ∣ a 11 a 12 a 21 a 22 ∣ begin{vmatrix} a_{11} a_{12}\\\\ a_{21} a_{22} end{vmatrix} ∣ ∣ ​ a 11 ​ a 21 ​ ​ a 12 ​ a 22 ​ ​ ∣ ∣ ​ a i j a_{ij} a ij ​ : i是行标,j是列标 ∣ a 11 a 12 a 21 a 22 ∣

    2023年04月09日
    浏览(31)
  • 线性代数——行列式相关性质

    目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行(列),行列式变号  三、行列式某行(列)有公因子k,则k可以提到行列式外 四、行列式中若两行成比例,则行列式为0 五、行列式的某一行(列)的元素都是两数之和,则  六、将行列式的某行(列)元素乘

    2024年01月19日
    浏览(42)
  • 线性代数 第一章 行列式

    一、概念 不同行不同列元素乘积的代数和(共n!项) 二、性质 经转置行列式的值不变,即 ; 某行有公因数k,可把k提到行列式外。特别地,某行元素全为0,则行列式的值为0; 两行互换行列式变号,特别地,两行相等行列式值为0,两行成比例行列式值为0; 某行所有元素都

    2024年02月06日
    浏览(37)
  • 线性代数的本质(四)——行列式

    行列式引自对线性方程组的求解。考虑两个方程的二元线性方程组 { a 11 x 1 + a 12 x 2 = b 1 a 21 x 1 + a 22 x 2 = b 2 begin{cases} a_{11}x_1+a_{12}x_2=b_1 \\\\ a_{21}x_1+a_{22}x_2=b_2 end{cases} { a 11 ​ x 1 ​ + a 12 ​ x 2 ​ = b 1 ​ a 21 ​ x 1 ​ + a 22 ​ x 2 ​ = b 2 ​ ​ 可使用消元法,得 ( a 11 a 22 − a

    2024年02月07日
    浏览(45)
  • 【线性代数】一、行列式和矩阵

    ∣ A B ∣ = ∣ A ∣ ∣ B ∣ |AB|=|A||B| ∣ A B ∣ = ∣ A ∣ ∣ B ∣ 行列互换其值不变, ∣ A T ∣ = ∣ A ∣ |A^T|=|A| ∣ A T ∣ = ∣ A ∣ ∣ A ∗ ∣ = ∣ A ∣ n − 1 ( 由 A A ∗ = ∣ A ∣ E 推 导 而 来 ) |A^*|=|A|^{n-1}(由AA^*=|A|E推导而来) ∣ A ∗ ∣ = ∣ A ∣ n − 1 ( 由 A A ∗ = ∣ A ∣ E 推 导 而

    2024年02月05日
    浏览(34)
  • 线性代数行列式的几何含义

    行列式可以看做是一系列列向量的排列,并且每个列向量的分量可以理解为其对应标准正交基下的坐标。 行列式有非常直观的几何意义,例如: 二维行列式按列向量排列依次是 a mathbf{a} a 和 b mathbf{b} b ,可以表示 a mathbf{a} a 和 b mathbf{b} b 构成的平行四边形的面积 ∣ a b ∣

    2024年02月11日
    浏览(36)
  • 【线性代数】P1 行列式基本概念

    二阶行列式 二阶行列式:两行两列,四个元素,用 a i j a_{ij} a ij ​ 表示,其中 i i i 表示行标, j j j 表示列标。 左上角到右下角为主对角线,左下角到右上角为次对角线; 行列式的值为主对角线上的值相乘减去次对角线相乘的值。 三阶行列式 三阶行列式:三行三列,九个

    2023年04月24日
    浏览(26)
  • 【线性代数基础】从面积看行列式

    要想探索线性代数的世界,矩阵和行列式是绕不开的。 国内大部分线性代数教材基本都从行列式开始讲起。在初学者眼中,课本上来就是概念输出,讲行列式和矩阵,将一堆数字按照特定的规则进行代数运算,很容易让人一头雾水。 本文将从线代学习者的角度,对线代中的

    2024年02月22日
    浏览(33)
  • 线性代数——行列式按行(列)展开

    目录 一、余子式:将行列式某元素所在行和列的元素全去掉 剩余部分所构成的行列式,称为该元素的余子式 二、代数余子式 三、行列式等于它的任一行(列)的各元素与对应代数余子式乘积之和  四、行列式某行元素(列)与其他行(列)对应元素的代数余子式相乘,然后

    2024年01月17日
    浏览(33)
  • 【线性代数】P4 行列式相乘+范德蒙德行列式+克莱姆法则 cramer

    行列式相乘的原则,就是将第一个行列式中依次将每行的每个元素分别与第二个行列式每列的每个元素进行相加再相乘。 其实这样理解:已知两个行列式,如上,相乘有新行列式,新行列式左上角第一个值为: a 11 *b 11 +a 12 *b 21 +a 13 *b 31 实例2: 当然,三阶行列式无法与四阶

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包