优化模板

O1快速乘+龟速乘+快速幂+矩阵快速幂
/*
a%b,在整数除法下它等价于a − a/b × b

*/
#define ll long long
inline ll mulit(ll x,ll y,ll mod)//O1快速乘
{
    return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;
}
//////////////////////////////////////////////////////////
ll mulit(ll a,ll b,ll c){//龟速乘
    ll ans=0;
    ll res=a;
    while(b){
      if(b&1)
        ans=(ans+res)%c;
      res=(res+res)%c;
      b>>=1;
    }
    return ans;
}
//////////////////////////////////////////////////////////
ll pow(ll x,ll n,ll mod){//快速幂
    ll res=1;
	while(n>0){
	   if(n%2==1){
	   	 res=res*x;
	   	 res=res%mod;
	   }
	   x=x*x;
	   x=x%mod;
	   n>>=1;
	}
	return res;
}
//////////////////////////////////////////////////////////
struct matrix{//矩阵快速幂
	ll m[5][5];
};
matrix matrix_multi(matrix a,matrix b){
	matrix tmp;
	for(int i=0;i<5;i++)
	for(int j=0;j<5;j++){
		tmp.m[i][j]=0;
		for(int k=0;k<5;k++)
			tmp.m[i][j]=((tmp.m[i][j])% (MOD-1) + (a.m[i][k]*b.m[k][j]+MOD-1)% (MOD-1)) % (MOD-1);
	}
	return tmp;
}
matrix matrix_pow(matrix a,matrix b,ll n){
	while(n>0){
		if(n&1) b=matrix_multi(a,b);
		a=matrix_multi(a,a);
		n>>=1;
	}
	return b;
}
 /////////////////////////////////////////////
 ll mulit(ll a,ll b,ll c){//龟速乘
     ll ans=0;
     ll res=a;
     while(b){
       if(b&1)
         ans=(ans+res)%c;
       res=(res+res)%c;
       b>>=1;
     }
     return ans;
 }
 ll pow(ll x,ll n,ll mod){//快速幂
     ll res=1;
 	while(n>0){
 	   if(n%2==1){
 	   	 res=mulit(res,x,mod);
 	   }
 	   x=mulit(x,x,mod);
 	   n>>=1;
 	}
 	return res;
 }
 ////////////////////////////////////////
 ll gcd(ll a,ll b){
     if(a==0)return 1;
     if(a<0) return gcd(-a,b);
     while(b){
         long long t=a%b;
         a=b;
         b=t;
     }
     return a;
 }

二分优化
int lower_b(int l,int r,int n){
  while(l<=r){
    //cout<<l<<" "<<r<<endl;a
    int mid=(l+r)/2;
    if(n>b[mid]) l=mid+1;
    else r=mid-1;
  }
  return l;
}
int lower_b(int l,int r,int n){
  while(r-l>1){
    //cout<<l<<" "<<r<<endl;a
    int mid=(l+r)/2;
    if(n>b[mid]) l=mid;
    else r=mid;
  }
  return l;
}

输入挂
inline int read()//快读
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-48;c=getchar();}
    return x*f;
}

inline void put(int x)//快输
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) put(x/10);
     putchar(x%10+'0');
}

常用头文件
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <limits.h>
#include <stack>
#include <queue>
#include <set>
#include <map>
const int
memset(hi, 0LL, sizeof(long long) * (N+1)
next_permutation(a,a+n);
continue;
priority_queue<int> p;
/*
在ubuntu终端下复制粘贴(推荐第二种骚操作)
  1:ctrl + shift + c,ctrl + shift + v
  2:直接鼠标左键选中要复制的命令,然后在需要粘贴的地方按一下鼠标滚轮即可
*/
/*
所谓的“卡常”,有两种TLE的可能:
    1. 50000组数据,每组数据对着2e6的数组memset的提交不是少数。
    2. 对着2e6的输入量用getline,getline和cin没有什么区别
*/
/*
    测 1s 跑多少亿
    栈空间
    行末空格行尾回车
*/

发布了70 篇原创文章 · 获赞 22 · 访问量 6494

猜你喜欢

转载自blog.csdn.net/weixin_44410512/article/details/102601351
今日推荐