一。快速冪
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;