学得感觉很多很杂。刷的题不多,有些模板都还没有搞清楚。寒假太浪造成考试要凉,大概就随便整理了一下。后期再更新。
贪心(合并果子)
最先考虑最大化
优先队列
{}
分治与构造(分型)
{}
动态规划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