acm复习

学得感觉很多很杂。刷的题不多,有些模板都还没有搞清楚。寒假太浪造成考试要凉,大概就随便整理了一下。后期再更新。

贪心(合并果子)
最先考虑最大化
优先队列
{}

分治与构造(分型)
{}

动态规划dp(最长公共子串、子序列 、 最长上升子序列 课上未学:背包、数位dp)
构造dp方程
lst

{}

群论polya定理
(旋转、翻转,构成多少种xx,或者染色方案数。如:项链
求循环节):
欧拉函数、gcd、循环节
1)只有旋转(平面内旋转最小单位角度 360° / n, 一共n种旋转方案,第i种方案的旋转角度 i * 360° / n, 其循环节为 gcd(n,i) )
2)考虑翻转,旋转的情况:
旋转:
N个点顺时针转动360/n 个角度,第i个旋转置换的循环数gcd(n,i);旋转总方案:sigm m^gcd(n,i) / n(i=1,2,…n)
翻转:
注意一下 / 号 代表向下取整的意思
N为偶数(分两种情况讨论):
对称轴不过顶点:循环节:n / 2, 方案数:m ^ (n / 2)
对称轴过顶点:循环节:(n / 2 +1), 方案数 : m ^ (n / 2 + 1)
N为奇数:循环节:( (n + 1) / 2 ), 方案数 : m ^ ((n+1) /2)

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll fast_pow(ll a, ll b){
    ll res = 1;
    while(b>0){
        if(b&1) res = res*a;
        a = a * a;
        b >>= 1;
    }
    return res;
}
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        if(n+m==0) break;
        if(n==0||m==0){
            printf("0\n");
            continue;
        }
        ll ans = 0;
        for(int i=1;i<=n;++i){
            ans += fast_pow(m,gcd(n,i));
        }
        ans /= n;
        ans += ((fast_pow(m,(n+1)/2)+fast_pow(m,n/2+1))/2LL);
        ans /= 2;
        printf("%lld\n",ans);
    }
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
ll fast_pow(ll a,ll b){
    ll res = 1;
    while(b>0){
        if(b&1) res = res*a%mod;
        a = a*a%mod;
        b >>= 1;
    }
    return res;
}

//get phi(n)
int phi(int n){
    int res = n;
    for(int i=2;(long long)i*i<=n;++i){
        if(n%i==0){
            res = res / i * (i-1);
            while(n%i==0){
                n /= i;
            }
        }
    }
    if(n>1) res = res/n*(n-1);
    return res;
}

int main(){
    int T,n,m,kase=0;
    long long inv2 = fast_pow(2,mod-2); //求2模mod的逆元
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&m,&n);
        ll ans = 0;
        int tmp = n;
        for(int i=1;(long long)i*i<=n;++i){
            if(i*i==n){
                ans = (ans+phi(i)*fast_pow(m,i))%mod;
            }
            else if(n%i==0){
                ans = (ans+phi(n/i)*fast_pow(m,i)%mod+phi(i)*fast_pow(m,n/i)%mod)%mod;
            }
        }
        ans = ans*fast_pow(tmp,mod-2)%mod; //	ans / n
        ans = (ans+inv2*(fast_pow(m,(tmp+1)/2)+fast_pow(m,(tmp/2)+1)%mod)%mod)%mod;
        ans = ans*inv2%mod;
        printf("Case #%d: %lld\n",++kase,ans);
    }
    return 0;
}




图论搜索(迷宫,最短路径)bfs\dfs

数论(莫比乌斯反演、exgcd、lucas算组合数、快速模幂、最大公因数最小公倍数、ax+by=c的求解、解同余方程)

二分图(最大匹配、完美匹配、是否能分成两个集合(构成二分图)、最小覆盖数、最大独立集)
最大独立集点数 = 二分图G的顶点总数 – G的最大匹配数
涉及:
匈牙利算法、KM算法

递推关系与矩阵幂
(斐波那契数列、兔子序列)推中间矩阵,利用矩阵快速幂算法算

计算几何(给出若干个点,求一个周长最大的凸包,并给出周长)
凸包算法:步进法、Graham扫描法

网络流
(最短路上最大流、最大费用最大流、最小费用最大流MCMF、也可用于求二分图题目)
dicnic
spfa
Bellman-Ford
mcmf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值