小知识点
常用的数学函数
1.|x| abs(x) 求整数的绝对值,参数类型为int;
2.|x| fabs(x) 求实数的绝对值,参数类型为double;
3.√x sqrt(x)
4.e^x exp(x)
5.lnx log(x)
6.lgx log10(x)
7.x^y pow(x,y)
8.10^x pow(10,x)
9.sinx sin(x)
10.cosx cos(x)
输出格式
1. %d 以十进制输出带符号整数(正数不输出符号)
2. %o 以八进制输出 (不输出前缀0)
3. %x %X 以十六进制输出 (不输出前缀0X)
4. %u 以十进制输出无符号整数
5. %f 以小数形式输出单,双精度实数
6. %e %E 以指数形式输出单,双精度实数
7. %g %G
8. %c 输出单个字符
9. %s 输出字符串
易忘提醒
1 %md 表明以宽度m输出数值;
2 %-md 结果左对齐
3 %0md 结果空位用0补齐
字符串处理
1,puts(); //输出一个字符串(字符数组)
2,gets(); //输入字符串
3,strcpy(); //字符串复制,
eg: strcpy(c1,c2);// 将c2复制到c1中;
4,strcat(); //连接字符串
5,strcmp(); //比较字符串
6,strlen(); //检测字符串长度
7,strlwr(); //字符串改成小写
8,strupr(); //字符串改成大写
快速幂模板
快速幂求(a^b)%n
int quickPow(int a,int b,int n){
if(b==1) return a;
if(b%2==0){//b是偶数
int t=quickPow(a,b/2,n);
return t*t%n;
}else{ //b是奇数
int t=quickPow(a,b/2,n);
t=t*t%n;
t=t*a%n;
return t;
}
}
非递归形式
int quickPow(int a,int b,int n){
int ret=1;
while(b){
if(b%2==1) ret=ret*a%n;
a=a*a%n;
b=b/2;
}
return ret;
}
质数的判定
注意:1既不是质数,也不是合数;2是最小的质数, 且为唯一的偶质数。
kmp模板
void get_next()
{
int k=-1,i=0;
nextt[0]=-1;
while(i<la)
{
if(k==-1||a[i]==a[k])
{
i++;
k++;
nextt[i]=k;
}
else
k=nextt[k];
}
return ;
}
int kmp()
{
int i=0,k=0,ans=0;
while(i<lb)
{
if(k==-1||a[k]==b[i])
{
i++;k++;
}
else
k=nextt[k];
if(k==la)
{
ans++;
k=nextt[k];
}
}
return ans;
}
马拉车模板
求最长回文子串
void malache()
{
int k=0;
c[k++]='$';
c[k++]='#';
for(int i=0;i<l;i++)
{
c[k++]=a[i];
c[k++]='#';
}
int mx=0,id=0;
for(int i=0;i<k;i++)
{
mp[i]=mx>i?min(mp[2*id-i],mx-i):1;
while(c[i+mp[i]]==c[i-mp[i]])
{
mp[i]++;
}
if(i+mp[i]>mx)
{
mx=i+mp[i];
id=i;
}
}
}
int main()
{
while(~scanf("%s",a))
{
l=strlen(a);
malache();
int ans=0;
for(int i=0;i<2*l+2;i++)
{
ans=max(ans,mp[i]-1);
}
printf("%d\n",ans);
}
}
二分模板
int Erfen(int l,int r)
{
int l,r=n,ans;
while(l<=r)
{
int mid(l+r)>>1;
if(check(mod))//如果满足要求
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
return ans;
}
实数域上的二分
double Erfen(double l,double r)//dlt=0.001(根据题目要求决定精度)
{
while(fabs(l-r)>dlt)
{
double mid(l+r)/2.0;
if(check(mod))//如果满足要求
{
r=mid;
}
else
{
l=mid;
}
}
return l;
}