1.gcd
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}
2.高精度板子(建议使用java和py,哭)
3.欧拉筛(打表)
int prime[1100000],primesize,phi[11000000];
bool isprime[11000000];
void getlist(int listsize)
{
memset(isprime,1,sizeof(isprime));
isprime[1]=0;
for(int i=2;i<=listsize;i++)
{
if(isprime[i])prime[++primesize]=i;
for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
{
isprime[i*prime[j]]=0;
if(i%prime[j]==0)break;
}
}
}
4.exgcd&逆元
ll exgcd(ll a,ll b,ll &x,ll &y)
{
ll d,t;
if(!b){x=1;y=0;return a;}
d=exgcd(b,a%b,x,y);
t=x-a/b*y;x=y;y=t;
return d;
}
ll inv(ll t,ll p)
{
ll x,y;
ll d=exgcd(t,p,x,y);
return d==1?(x%p+p)%p:-1;
}
5.快速幂
ll ksm(int a,int b)
{
if(b==1)return a;
if(b%2==1)return (ksm(a,b/2)*ksm(a,(b+1)/2))%1000;
else return (ksm(a,b/2)*ksm(a,b/2))%1000;
}
6.dfs
int dfs(int k)
{
if(特判){
...
return;
}
if(越界/结束){
return
}
for(扩展){
if(满足条件){
标记;
dfs(k+1);
回溯;
}
}
}
7.dij
void Dijstra()
{
int i,j;
for(i=0; i<n; ++i)
{
dis[i]=INF;
vis[i]=0;
}
dis[1]=0;
int v;
for(i=1; i<=n; ++i)
{
min=INF;
for(j=1; j<=n; ++j)
{
if(!vis[j]&&d[j]<min) //每次找点的过程,首先这个点没有被发现,然后找一个最小点
{
min=d[j];
v=j;
}
}
vis[v]=1;
for(j=1; j<=n; ++j) //加进最小点后,再修改从源点没有被发现的点的最短路径
{
if(!vis[j]&&dis[v]+mp[v][j]<dis[j])
dis[j]=dis[v]+mp[v][j];
}
}
int ans=-1;
for(i=1; i<=n; ++i)
if(dis[i]>ans)
ans=dis[i];
}
8.悬线法
//处理l
for(i=1;i<=m;i++)
for(j=2;j<=n;j++)//从左往右
if(s[i][j]==1&&s[i][j-1]==1)//根据题意更改
l[i][j]=l[i][j-1];
//处理r
for(i=1;i<=m;i++)
for(j=n-1;j>=1;j--)
if(s[i][j]==1&&s[i][j+1]==1)
r[i][j]=r[i][j+1];
//up
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(i>1&&s[i][j]==1&&s[i-1][j]==1){
r[i][j]=min(r[i][j],r[i-1][j]);
l[i][j]=max(l[i][j],l[i-1][j]);
up[i][j]=up[i-1][j]+1;
}
//根据题意
ans=max(ans,(r[i][j]-l[i][j]+1)*up[i][j]);
}
}