O1快速乘+龟速乘+快速幂+矩阵快速幂
#define ll long long
inline ll mulit(ll x,ll y,ll mod)
{
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){
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){
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;