板子合集
此板子合集可能借鉴了其他多位大佬的代码,如有侵权敬请告知,此博客仅供个人学习,无商业用途。
gcd(最大公因数)
int gcd(int a,int b)//a<b
{
return b?gcd(b,a%b):a;
}
ksm(快速幂)
long long ksm(long long a,long long b,long long p)//a的b次方对p取余
{
long long ret=1;
while(b){
if(b&1) ret=ret*a%p;
a=a*a%p;
b>>=1;
}
return ret%p;
}
优化
一个大佬的优化博客优化
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
普通高精度加法和乘法
int chai(int a[],int x)//将大数x拆分倒着存入数组 例如123->a[0]=3,a[2]=1;
{
int i=0;
while(x>=10)
{
a[i++]=x%10;
x/=10;
}
a[i]=x;
return i;//返回有效数字长度
}
void jia(int num[],int num_i,int b[],int b_i)//num代表的数加上b代表的数,num_i代表num的长度
{
//默认mun_i>=b_i
int i=0;
for(i;i<=num_i;i++)//若num_i由函数chai()得来,则为i<=num_i
num[i]+=b[i];//一一相加
if(num[i]>=10) //进位运算
{
num[i+1]+=num[i]/10;
num[i]%=10;
}
}
void jian(int num[],int num_i,int b[],int b_i)//num代表的数减去b代表的数
{
//默认mun_i>=b_i
int i=0;
for(i;i<num_i;i++)
num[i]-=b[i];//一一相减
if(num[i]<0) //补位运算
{
num[i]+=10;
num[i+1]-=1;
}
}
void cheng(int a[],int a_i,int b[],int b_i,int num[])//a[],b[]相乘存到num[]
{
//默认a_i>=b_i 其实无所谓
int i,j;
for(i=0;i<=a_i;i++)
{
for(j=0;j<=b_i;j++)
{
num[i+j]+=a[i]*b[j];//num[]初始化为0
}
}
}//num[]计算完毕后要进行进位运算才可以正常以十进制展示结果
输入输出
在多组样例的题目中,最好用scanf进行输出。
若想用cin,cout,最好在主函数里加入以下代码:
ios::sync_with_stdio(false);
如图:
线性筛
int prime[1100000],primesize,phi[11000000];
bool isprime[11000000];
void getlist(int listsize)
{
memset(isprime,1,sizeof(isprime));
isprime[1]=false;
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]]=false;
if(i%prime[j]==0)break;
}
}
}