写代码要注意的几点。

一。快速幂

 

1 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
2 /*  对于有可能爆数组的值要强制转换类型  */
3 /*         并对这个值取模mod            */
4 /*   const int mod (1e9为double类型)    */
5 /*           强制转换为int              */ 
6 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 

 


1
int fast_pow(int n,int k){ 2 int ans = 1;//在函数内部声明。 3 if(k == 0) 4 return 1; 5 for(;k;k>>=1,n=(LL)n*n%mod) 6 if(k&1) 7 ans=(LL)ans*n%mod; 8 return ans; 9 }

二。并查集压缩路径时

int find(int x){
    if(fa[x]==x)
    return x;
    else{
         int  t=fa[x];  
           fa[x]=find(t);//先等于find(t),再返回;
           }
    return fa[x];
}

三。取模时

for(int i = 2;i <= k+1;i++)
       for(int j = 1;j <= i;j++){
             f[i][j] = (LL)(f[i-1][j]+f[i-1][j-1]) % mod;//取模的运算级高,加法要加括号; 
    }

四。读字符串时

char s[100];
scanf("%s",s);//只写变量名称,不写大小;
scanf("%s",s+1);//从下标[1]开始存;

读下一个字符串前要读一个空字符串,(行末空格和回车);

五。函数内的变量最好是局部变量。

六。开数组和定义新变量时一定要对照原题中的数据范围,防止越界爆数组或是数组开大浪费。

七。提交前注意检查头文件和读入输出文件‘

freopen(".in","r",stdin);
freopen(".out","w".stdout);//尤其是这一行。不要用斜杠注释掉‘’

八。注意比较形似的STL

lower_bound();
 upper_bound();
 //在一个升序数组上进行二分查找。
 //前者返回第一个大于等于查询值的位置;
 //第二个返回第一个大于查询值的位置;

九。一般遇到让若干项元素的最小值最大或最大值最小的问题,要用二分的方法;

二分答案mid,检查一下能不能满足题中的条件,如果可以,下一步在[mid+1,r]中再二分,反之在[l,mid]中二分。

十。牢记欧几里得算法和扩展欧几里得算法

int gcd(int a,int b){
    if(!b)  return a;
    else return gcd(b,a&b);
}//欧几里得算法。
void exgcd(int a,int b,int &d,int &x,int &y){
    if(!b){
        d = a;
        x = 1;
        y = 0;
    }
    else{
        exgcd(b,a%b,d,y,x);
        y-=((a/b)*x);
    }
}//扩展欧几里得算法。

有时得到的x,y是负数,解集为(x+k*b' , y-k*a');

b' = b/gcd(a,b);

a' = a/gcd(a,b);

十一。取模的基本性质

(a+b)%b = ((a%n)+(b%n))% n;

(a- b)%b = ((a%n)-(b%n)+ n)% n ;

a*b%n = (a%n)*(b&n)%n;

除法不能取模,如果要取模,要先要求逆元;

十二。标记用完要清零。

十三。大数据的运算要用高精度。

十四。01背包和完全背包的区别

void ZeroOnePack(int f[],int V,int v,int w){
    for(int i = V,i>=v;--i)
       f[i] = max(f[i],f[i - v] + w);
} 
void CompletePack(int f[],int V,int v,int w){
    for(int i = v;i <= V;i++)
       f[i] = max(f[i],f[i - v] + w);
}
十五。int a;int b;double sum;
在计算sum = a + b;时要把a和b强制转化成double类型
int a;int b;
double sum;
sum = (double) a + b;

 

posted @ 2016-08-12 16:35  可能是轩轩叭  阅读(428)  评论(0编辑  收藏  举报