码迷,mamicode.com
首页 > 其他好文 > 详细

模板settle down

时间:2019-10-08 12:33:51      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:不同的   一个   log   成功   快速   意义   进制   节点   无向图   

  • 树剖求lca
  • 第二类Stirling数
  • 倍增+floyd 跑路【G[i][j][logn] 和 dis[i][j]的巧妙定义】
  • spfa 负环 多组要建图的数据记得mem(head,0),记得初始化cnt[s]=1;,cnt[v]>n而不是>=(容斥原理)
  • 欧拉图 考虑:1.连通 2.欧拉图的判定
  • st表
  • 会议座位 以第一个序列作为基准,用数组x映射一下b在a的位置,那么总不满值就是新的编号的b的逆序对个数

P2613 【模板】有理数取余

分析题目,发现c可以转化为a*b^-1

一、费马小定理(【参考程序一】):
对于本题而言,a为整数,且除数为质数(p=19260817),因此可以使用费马小定理,即 a^(p-1)≡1(mod p),然后得出
c=a*b^(-1)=a*b^(p-2)(mod p),接下来用快速幂求即可
特别的,当b=0时,即分母为0,因此无解。
本算法的优势是较容易写,但除数必须是质数,因而通用性不强。

二、扩展欧几里得(【参考程序二】)
解析题目发现:本题就是求b在mod p的意义下的逆元。
求a的逆元相当于求解ax=1(mod p),这个方程可以转化为ax-my=1,然后直接套用扩欧求解x,y。
特别的,当gcd(a,p)≠1 gcd(a,p)≠1时,方程无解,因此a也无逆元。
a、b都很大,不能直接存。

因为(a+P)^k==a^k(mod P)
以及(a+P)*b==a*b(mod P)
快读时把a、b都对P取模即可。

st 表

rep(i,1,n)rd(f[i][0]);
    rep(j,0,20)
        for(int i=1;i+(1<<j)-1<=n;++i)
            f[i][j+1]=max(f[i][j],f[i+(1<<j)][j]);
    while(m--){
        int l,r;rd(l),rd(r);
        int len=log2(r-l+1);
        printf("%d\n",max(f[l][len],f[r-(1<<len)+1][len]));
    }

欧拉图

*如果图中奇数度的顶点个数小于等于2,则一定存在欧拉回路

*在无向图中每个顶点的度都是偶数,则一定存在回路

*在有向图中,每个节点的入度等于出度,则存在回路

使用并查集维护经过点的个数
设hebing为成功合并的次数,n为点数
则整张图含欧拉路当且仅当hebing>=n-1且奇度数点为0或2
//tot:出现的点的个数(把一种颜色看做一个点)
//hebing记录成功合并的次数

- 模板 进制转换 (n进制转m进制)

s[i]-‘A‘+10b[i]+‘A‘-10的应用

    rd(n);cin>>s;rd(m);
    int len=s.length();
    rep(i,1,len){
        if(isalpha(s[i-1]))a[i]=s[i-1]-'A'+10; 
        else if(isdigit(s[i-1]))a[i]=s[i-1]-'0';
    }
    int quan=1;//n进制转10进制
    dwn(i,len,1){
        sum+=a[i]*quan;
        quan*=n;
    }
    int wei=0;//用取模法把10进制转成m进制
    for(int len=1;sum;sum/=m,len++){
        b[len]=sum%m;
        wei++;
    }
    dwn(i,wei,1){//注意倒序,结合2进制思考
        if(b[i]>=10)printf("%c",b[i]+'A'-10);
        else printf("%d",b[i]);
    }

【第二类Stirling数】P1287 盒子与球

表示n个球放入r个不同的盒子的方法。

状态设定:设f[i][j]表示前i个球放入j个盒子的方法

答案表示:f[n][r]* fac[r] (最后的最后,由于是r个不同的盒子,所以要×*r!)

状态转移:f初始化为1,f[i][j]=f[i-1][j-1]+j*f[i-1][j]

1.考虑第i个球不放入j-1个盒子,而是新开一个盒子(f[i-1][j-1]前i-1个已经放好在了前j-1个盒子,第i个放入新的j号盒子)

2.考虑第i个球放入已经选好的j个盒子.(j* f[i-1][j]前i-1个已经放好在了前j个盒子,第i个放入选好的前j号盒子的任意一个,所以要* j)

模板settle down

标签:不同的   一个   log   成功   快速   意义   进制   节点   无向图   

原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!