zoukankan      html  css  js  c++  java
  • YBT 6 数学基础

    $补+写题ing$

    第 1 章 快速幂 

    序列的第 k 个数

    link

    $solution:$

    板子

    A 的 B 次方

    link

    $solution:$

    板子

    [NOIP2013] 转圈游戏

    link

    $solution:$

    板子

    越狱

    link

    $solution:$

    简单的容斥原理,$m^n-m imes prod_{i=1}^{n-1} m-1$

    第 2 章 质数

    Prime Distance

    link

    $solution:$

    先筛掉$[1,sqrt{R}]$,然后在暴力即可。

    质因数分解

    link 

    $solution:$

    暴力枚举

    轻拍牛头

    link

    $solution:$

    考虑直接加即可,因为可以将相同的数同时操作,时间$O(能过)$

    Goldbach's Conjecture

    link

    $solution:$

    板子

    Sherlock and His Girlfriend

    link

    $solution:$

    构造将质数染$1$,合数为$2$,为最优解,同时注意特判即可。

    樱花

    link

    $solution:$

    化简得$n!(x+y)=xy$,$xy-n!(x+y)=0$,$(n!)^2-n!(x+y)+xy=(n!)^2$

    得$(n!-x)(n!-y)=(n!)^2$,因为$x,ygeq n!$,所以方案数即为$(n!)^2$的约数个数

    第 3 章 约数

    反素数 Antiprime

    link

    $solution:$

    反素数肯定满足其分解质因数后约数个数呈不上升。通过剪枝优化即可过。

    [NOIP2009] Hankson 的趣味题

     link

    $solution:$

    $gcd(x,a0)=a1,lcm(x,b0)=b1$。求其$x$的方案数。

    考虑将$lcm(x,b0)$形式化简,得$x=frac{b1}{b0} imes gcd(x,b0)$。

    考虑枚举$gcd(x,b0)$,因为$gcd(x,b0)$一定是$b0$的一个约数直接在$[1,sqrt{b0}]$中枚举约数$x$,在将其$b0/x$两个判断即可。

    时间复杂度:$O(n imes sqrt{b0})$。

    X-factor Chain

    link

    $solution:$

    将其$x$分解质因数后得$x=prod_{i=1} p_i^{b_i}$ ,考虑答案的贡献,因为要将其最大所以第一次肯定选$x$的一个质因子。然后容易发现每次只要将一个没有用完的$b_i$使用$1$个即为最长长度,即$sum_{i=1} b_i$。

    考虑此最长长度模型的构建后,使用杨辉三角直接组合数即可。

     [JLOI2014] 聪明的燕姿

    link

    $solution:$

    通过约数和公式将其$[1,sqrt{2 imes 10^9}]$内的素数筛掉后,对于每个$x$直接枚举其因子与指数直接搜索求求解即可。

    剪枝直接枚举其会产生两个质因数的情况,这是只要枚举当前$x$的$sqrt{x}$。而只有$1$个的暴力判断即可。

    第 4 章 同余问题

    青蛙的约会

    link

    $solution:$

    设最少在$F$次后碰面。

    则$(x+Fm)-(y+Fn)equiv0(modspace L)$

    转化可得$F(m-n)equiv y-x(modspace L)$

    将$equiv$转换成$=$,则$F(m-n)+GL=y-x$,将$m-n$为正数后$exgcd$解此方程即可。

    [NOIP2012] 同余方程

    link
    $solution:$

    解$ax+by=1$,$exgcd$裸题。

    Sumdiv

    link

    $solution:$

    等比数列求和公式套乘法逆元即可。

    曹冲养猪

    link

    $solution:$

    $crt$模板题。

    Strange Way to Express Integers

    link

    $solution:$

    $excrt$模板题。

    计算器

    link

    $solution:$

    $BSGS$模板题。

    荒岛野人

    link

    $solution:$

    数据范围:$nleq 15,Mleq 10^6$,这就是解题的关键。

    暴力$M$,对于两个野人直接求解两个野人相遇时间。

    五指山

    link

    $solution:$

    $exgcd$模板题。

    Biorhythms

    link

    $solution:$

    $crt$模板题。

    C Looooops

    link

    $solution:$

    $exgcd$模板题。

    第 5 章 矩阵乘法

    矩阵 A×B

    link

    $solution:$

    考验矩阵乘法的基本计算。 

    Fibonacci 第 n 项

    link

    $solution:$

    矩阵乘法板子。

    Fibonacci 前 n 项和

    link

    $solution:$

    矩阵乘法板子

    佳佳的 Fibonacci

    link

    $solution:$

    考虑构造求解,设$g_i=sum_{k=1}^i (n+1-k) imes f_i,s_i=sum_{k=1}^i f_i$,答案即为$(n+1) imes s_n-g_n$。

    矩阵快速幂即可。

    Fibonacci

    link

    $solution:$

    矩阵乘法板子

    GT 考试

    link

    $solution:$

    一道很有意思的题目。

    考虑$dp$,设$f(i,j)$表示其现在在$A$串$i$位,且$A[i,j+1]$与$B[1,j]$完美匹配。

    则$f(i,j)=sum_{k=1}^{m-1} f(i-1,k) imes g(k,j)$。其中$g(k,j)$表示在$B$串$j$位后面加上$1$个数字$([0,9])$后其在于$B$串匹配为$j$的个数,可以理解为加上$1$个数字使得$B$串与$A$串的匹配长度从$k$变为$j$。

    因为$|B|leq 20$,所以求$g$时可以考虑暴力求解,还可以利用$kmp$快速求解。

    直接矩阵优化$dp$即可。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    const int M=101;
    int n,m,mod,nex[M],g[M][M];
    struct Matrix{
        int a[M][M];
        void init(){memset(a,0,sizeof(a));}
    }G,F;
    Matrix operator*(Matrix x1,Matrix x2){
        Matrix x3;x3.init();
        for(int i=1;i<=m;i++){
            for(int k=1;k<=m;k++){
                for(int j=1;j<=m;j++) x3.a[i][j]+=x1.a[i][k]*x2.a[k][j],x3.a[i][j]%=mod;
            }
        }return x3;
    }
    Matrix ksm(Matrix a,int b){
        Matrix ans;ans.init();
        for(int i=1;i<=m;i++) ans.a[i][i]=1;
        while(b){
            if(b&1) ans=ans*a;
            a=a*a,b>>=1;
        }return ans;
    }
    char str[M];
    int main(){
        n=read(),m=read(),mod=read();
        scanf("%s",str+1);
        nex[1]=0;int j=0;
        for(int i=2;i<=m;i++){
            while(j>0&&str[j+1]!=str[i]) j=nex[j];
            if(str[i]==str[j+1]) j++;
            nex[i]=j;
        }
        for(int i=0;i<m;i++){
            for(int opt=0;opt<=9;opt++){
                int j=i;
                while(j>0&&opt!=(str[j+1]-'0')) j=nex[j];
                if(opt==(str[j+1]-'0')) j++;
                g[i][j]++;
            }
        }G.init(),F.init();
        for(int i=0;i<m;i++)
            for(int j=0;j<m;j++) G.a[i+1][j+1]=g[j][i];
        F=ksm(G,n);
        int ans=0;
        for(int i=1;i<=m;i++) ans+=F.a[i][1],ans%=mod;
        printf("%d
    ",ans);
    }
    View Code

    迷路

    link

    $solution:$

    对于边权只含有$01$做法非常显然,直接矩阵快速幂即可。

    而对于$边权leq 9$的图,可以考虑对于每个点拆点.当全部跑完$u$拆过的点后才能到达$v$,然后就常规操作即可。

    第 6 章 组合数学

    [NOIP2011] 计算系数

    link

    $solution:$

    $(ax+by)^k=sum_{i=0}^k C_k^ia^ib^{k-i}x^iy^{k-1}$

    2^k 进制数

    link

    $solution:$

    若$w%k=0$时,数位为$frac{w}{k}$,若不等,则为$frac{w}{k}+1$,且最高位为$2^{wmod k}-1$。

    组合数计算即可。

    组合

    link

    $solution:$

    $lucas$模板题。

    古代猪文

    link

    $solution:$

    题意要求$G^{sum_{i|n} C_n^i} mod 999911659$。

    瓶颈在这个式子$sum_{i|n} C_n^imod 999911659$。

    其实只有第一步比较难想。因为$999911659$是一个质数所以说若普通计算则时间直接爆炸。

    考虑优化,根据费马小定理的$a^{p-1}equiv 1(mod p)$,所以$p-1$是$1$个循环节,直接求$G^sum_{i|n} C_n^imod 999911658$。

    下面做法就十分显然了,$999911658=2 imes 3 imes 4679 imes 35617$,所以直接$lucas$下面的最后在用中国剩余定理合并即可。

    这样可以保证$lucas$的时间不会超时。

    牡牛和牝牛

    link

    $solution:$

    插板,现将其每个空拿$k$个,然后插板组合数即可。

    方程的解

    link

    $solution:$

    插板裸题。

    车的放置

    link

    $solution:$

    一道简单题。

    可以先处理两个矩形$(a imes b)(c imes d)$,最后会剩下$1$个$a imes d$的矩形。

    所以只要考虑在$a imes b$的矩形中放k个棋子的方案数。

    答案易得$C_a^k imes C_b^k imes k!$,$k!$是因为要相互随便匹配。

    所以分成$3$个的就做完了。

    所以$2$个就可以处理$(a imes b,(a+c) imes d)$两个矩形即可。

    [CQOI2014] 数三角形

    link 

    $solution:$

    $ans=C_{(n+1) imes (m+1)}^3-((n+1) imes C_{m+1}^3+(m+1) imes C_{n+1}^3)-(斜边三点共线的方案数)$

    所以只要求斜边三点共线的方案数即可。

    性质:对于两点$(x_1,y_1),(x_2,y_2)$,则两点所连线段经过整点的个数为$gcd((x_2-x_1+1),(y_2-y_1+1))$。

    证明:直接相似三角形即可。

    所以就可以想出$O(10^{12})$的方法,枚举两个端点,求中间点的个数。

    考虑优化,因为发现$gcd((x_2-x_1+1),(y_2-y_1+1))$只于距离有关,所以只要枚举距离然后计算对于此距离满足的方案数即可。

    时间复杂度:$O(10^6)$.

    Combination

    link

    $solution:$

    $Lucas$板子题。

    序列统计

    link

    $solution:$

    考虑对于每个点加上其下标(即为插板时给每个点送$1$个,使得必须要选),就可以保证其序列为单调递增。

    考虑当时长度为$len$,其权值范围为$[1+1,R-L+1+len]$。其可选权值为$R-L+len$。

    所以对于长度为$len$,其答案为$C_{R-L+len}^{len}=C_{R-L+len}^{R-L}$。

    设$R-L+1=M$,所以长度为$len$的答案为$C_{M+len-1}^{len-1}$

    所以所有答案为$sum_{i=1}^n C_{M+i-1}^{i-1}$。

    然后发现此刻时间复杂度仍为$O(常数 imes n)$。

    根据杨辉三角的$C_i^j=C_{i-1}^{j-1}+C_{i-1}^{j}$,所以$sum_{i=1}^n C_{M+i-1}^{i-1}$化简得$C_{n+M}^{M}-1$。

    $lucas$求组合数即可。

    [SHOI2015] 超能粒子炮・改

    link

    $solution:$
    求$sum_{i=0}^k C_n^i mod 2333$的值。

    成功又弱智了一次。

    对于直接求,时间复杂度为$:O(Tn)$,考虑优化。

    对于$C_i^jmod 2333$,由$Lucas$定理可得,$C_i^j=C_{imod p}^{jmod p} imes C_{frac{i}{p}}^{frac{j}{p}}$。$p$为模数。

    所以$原式=F(n,k)=sum_{i=0}^k C_{nmod p}^i mod 2333=C_{n/p}^0 imes sum_{i=0}^{p-1} C_{nmod p}^i+C_{n/p}^1 imes sum_{i=0}^{p-1} C_{nmod p}^i+……+C_{n/p}^{frac{k}{p}-1} imes sum_{i=0}^{p-1} C_{nmod p}^i+C_{n/p}^{frac{k}{p}} sum_{i=0}^{nmod p} C_{nmod p}^i$

    $=(sum_{i=0}^{p-1} C_{nmod p}^i) imes (sum_{i=0}^{frac{n}{p}-1} C_{k/p}^i)+C_i^{frac{k}{p}} sum_{i=0}^{nmod p} C_{nmod p}^i=f(nmod p,p-1) imes F(n/p,frac{k}{p}-1)+C_{n/p}^{frac{k}{p}} imes f(nmod p)$。

    $Lucas$加预处理$f$即可。

    时间复杂度$O(T imes log_{2333}^2 n)$

    礼物

    link

    $solution:$

    换句话说就是求$C_n^m mod p$,其中$p$为任意整数。

    $exlucas$即可。

    网格

    link

    $solution:$

    为什么要用数学,直接$dp$即可。

    有趣的数列

    link

    $solution:$

    对于奇数序列位置所填的数可以想成$($,偶数序列位置所填的数想成$)$。然后按照$1-2n$的排序,发现只要成合法括号匹配即为$1$种可行解。

    所以即为$Cat_n$,直接质因数分解算即可。

    树屋阶梯

    link

    $solution:$

    从$3->5$发现这不就是卡特兰数吗。再将$4$画出,发现是$14$,正好是$Cat_4$,所以猜测为$Cat_n$。

    若在有$k$阶梯高度上至少需要k个钢材,设$f_i$表示i高度的答案。$f_0=1,f_1=1$.

    所以$f_n=sum_{i=0}^{n-1} f_i imes f_{n-1-i}$。

    因为可以去枚举左上角的木块高度,然后右下角的高度就确定了,且可以将其扩展即为$1$组解。

  • 相关阅读:
    Redis持久化机制
    Java动态代理
    FFmpeg视频处理
    Redis集群
    解决vscode无法提示golang的问题
    解决vscode无法安装golang相关插件的问题
    近期小结
    近期小结
    稍稍解读下ThreadPoolExecutor
    响应式编程笔记三:一个简单的HTTP服务器
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/10561239.html
Copyright © 2011-2022 走看看