在这里提供几种基础的增加代码运行效率的几种方案
快速读取数字
快速读取数字,时间是scanf的1/20
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//inline
inline int read(){
int x=0,f=1;
char ch = getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
//遇见负号就改变正负号
f=-f;
}
ch = getchar();
}
while(ch>='0'&&ch<='9'){
//x<<1相当于x*2,x<<3相当于x*8,48对于的ascii是‘0’,11 0000,是而与它相异或的0-9之间的相当于直接减去‘0’
//表达式相当于x=x*10+ch-‘0’,但是位运算效率更高更快
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
int s=read();
cout<<s;
return 0;
}
功能快捷键
fill:
按照单元赋值,将一个区间的元素都赋同一个值
在头文件algorithm里面
如:一个长度为n的数组dis
fill(dis,dis+n,initValue);
memset:(只能0 和 -1)
按照字节填充某字符
在头文件cstring里面
memset(graph,0,sizeof(graph))
高精度相加
const int S = 1000000000;//需要实现高精度,每个数表示 10 ^ 9 位
const int NumSize = 4;//可以根据int的具体长度而增加
struct Num
{
int integer[NumSize];
}a[1001];
void add(Num &x, Num &y)
{
for (int i = 0; i < NumSize; i++)
{
x.integer[i] += y.integer[i];
}
for (int i = 1; i < NumSize; i++)//保证前一个还加上了后一个的进位
{
x.integer[i] += x.integer[i - 1] / S;
}
for (int i = 0; i < NumSize; i++)//保证每一个都没超过10的9次方
{
x.integer[i] %= S;
}
return;
}
位运算快速取模:
对于2的幂次方取整数如2,4,8,16
x & (mod -1),比% 快了10倍
但是一般的数字不可以
快速幂
把b转换成二进制数。
该二进制数第i位的权为2i-1
例如
a11 = a1+2+8
11的二进制是1011
因此,我们将a¹¹转化为
会比一个一个乘快很多
#include<bits/stdc++.h>
using namespace std;
long long quickpower(long long x,long long y)
{
long long ans=1,cnt=x;
while(y)
{
if(y&1)
{
ans*=cnt;
}
cnt*=cnt;
y>>=1;
}
return ans;
}
int main()
{
long long x,y,ans;
cin>>x>>y;
ans=quickpower(x,y);
cout<<ans;
return 0;
}
x的n次方求模:
主要使用两点求模性质,一个是
(a^ b)mod m = ((a mod m)^b)mod m
和 ab mod m = ((a mod m)(b mod m))mod m
但是由于求幂的时候乘1过慢,所以我们就需要利用快速幂,得到的结果不变
比如说x^2n mod m= ((x^n mod m)* (x^n mod m)) mod m
int n,m;
int result =1;
int po = n;
while(po){
if(po&1){
result = result%m * x%m;
}
x=(x*x)% m;
po>>=1;
}
return result%n;