1、long long的范围是+-的2^63-1,不是64,而unsigned long long可以到达这个范围。
2、题目答案看似很多,时间复杂度太高时,想想鸽笼原理,可能很少。
3、线性逆元方程 能在o(n)的时间内算出1-n所有数字的逆元。
处理阶乘的逆元
const int MOD = (int)1e9 + 7;//按题目要求的取余数 const int N = 1000000 + 5; int inv[N + 5]; void init_inv(){ inv[1] = 1; for(int i = 2; i < N; i ++) inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD; } jc[i]代表i的阶乘的逆元 A[0]=1; for(int i=1;i<=200000;i++){ A[i]=A[i-1]*i%mod; jc[i]=jc[i-1]*inv[i]%mod; }
4、模拟题也有可能爆 long long。
5、有关gcd的题目,要把两个数字拆成 m1*g,m2*g来找思路。
6、对于看上去是矩阵快速幂的题目,可以公式之间乱搞一下得到矩阵递推式。
7、对于非线性的递推式,比如f(n)=f(n-1)+2*f(n-2)+n^4,要把非线性的n^4变成线性的,也就是和(n-1)^4建立对应关系。
对于这个例子 n^4=((n-1)+1)^4,然后展开。hdu5950
8、dfs遍历找固定大小的环的时候,如果会出现大量的回头计算(比如要找大小为4的环,然后找到了1-2-1-3-1)。可以考虑从小到大建立单向边。hdu5952
9、题目给出的取模数如果不是质数,则不能用逆元来求,必须用过c[i][j]=c[i-1][j-1]+c[i-1][j]%mod,来递推.
10.算逆元,用快速幂计算 传进去的时候就要对a取模。因为当次数是奇数的时候,会有a=a*a%mod的运算。这里如果a太大,可能a*a直接爆了。
11、c++有自带的gcd函数,就是__gcd(x,y),而且非常快,但是现场赛没用过,最好用下面这个,(加了inline就和__gcd一样快了)
inline ll gcd(ll a,ll b) { if(b==0)return a; return gcd(b,a%b); }
12、在利用map判断是否存在的时候,用mp.count(),函数,否则可能会在map中这种情况,只是他的value是等于0的,这样在迭代的时候就会出问题。
和map相比,查找的时间快(内部是哈希表),但是key是无序的,头文件#include<unordered_map>。(c11)
在c++11以前要使用unordered_map需要
1 #include<cstdio> 2 #include<unordered_map> 3 using namespace std; 4 unordered_map<int, int>mp; 5 int main() { 6 mp[1] = 2; 7 if (!mp.count(2))printf("找不到元素2 "); 8 printf("%d ", mp[1]); 9 10 }
14、
用 ios::sync_with_stdio(false) 可以关同步,提高cin cout的速度,但是还是没有scanf printf快,而且用了关同步后,只能用cin cout或者只能用scanf printf,否则会wa而不是ce。
15、-1e9是爆int类型的
16、 x | n 这个符号表达,x能被n整除
17、当2^b<=k<2^(b+1) 时,1-k所有数能用b+1个数拼出来;(2进制覆盖)