模板部分:
#define LL long long #define FF(i,n) for(i=0;i<n;i++) LL f[N]; LL ans[N]; LL init[N]; LL buf[N]; void matrixMul(LL a[N],LL b[N],LL n,LL mod) { int i,j; FF(i, n) buf[i]=0; FF(i, n) FF(j,n) if(a[(i - j + n) % n] && b[j]) buf[i] = (buf[i] + a[(i - j + n) % n] * b[j]); FF(i, n) a[i] = buf[i] % mod; // 算完后再取模,节省时间 } void matrixMul(int n,int m,int mod) { int i,j; FF(i,n) ans[i] = (i==0); while(m > 1) { if(m&1) matrixMul(ans, init, n, mod); matrixMul(init, init, n, mod); m >>= 1; } matrixMul(init, ans, n, mod); }UVALive 4727 Jump 约瑟夫变形问题
模板部分:
LL gcd(LL a, LL b) { return b == 0 ? a : gcd(b, a % b); } void E_gcd(LL a, LL b, LL &d, LL& x, LL& y) { if(!b) { d = a; x = 1, y = 0; } else { E_gcd(b, a % b, d, y, x); y -= x*(a / b); } }
hdu 4497 GCD and LCM 质分解
模板部分:
const int N = 111111; vector<int> hav; bool isp[N]; int p[N], cnt; void getp() { int i, j;cnt = 0; isp[0] = isp[1] = 1; for(i = 2; i < N; i ++) { if(!isp[i]) { p[cnt ++] = i; if(i <= 1111)for(j = i * i; j < N; j += i) isp[j] = 1; } } } void get_hav(int h) //求h的所有质因数(算重复) { int i; for(i = 0; i < cnt && h > 1; i ++) { if(h % p[i] == 0) { h /= p[i]; hav.push_back(p[i]); i --; } } if(h != 1) hav.push_back(h); }
hdu 4418 Time travel 高斯消元
模板部分:
inline int sgn(double d) { if (fabs(d) < eps) return 0; return d > 0 ? 1 : -1; } int gauss(int N, int M){ int i, j, r, c, pvt; double maxp; for (r = 0, c = 0; r < N && c < M; ++ r, ++ c) { for (maxp = 0, i = r; i < N; ++ i) if (fabs(a[i][c])>fabs(maxp)) maxp = a[pvt=i][c]; if (sgn(maxp) == 0) { r--; continue; } if (pvt != r) for (j = r; j <= M; ++j) swap(a[r][j], a[pvt][j]); for (j = c+1; j <= M; ++j) { a[r][j] /= maxp; for (i = r+1; i < N; ++i) a[i][j] -= a[i][c]*a[r][j]; } } for (i = r; i < N; ++i) if (sgn(a[i][M])) return -1; if (r < M) return M-r; for (i = M-1; i >= 0; --i) for (j = i+1; j < M; ++j) a[i][M] -= a[j][M]*a[i][j]; return 0; }
ZOJ 2320 Cracking' RSA 其次布尔线性方程组,高斯消元。
int gauss(int N, int M) { int r, c, pvt; bool flag; for (r = 0, c = 0; r < N && c < M; ++ r, ++ c) { flag = false; for (int i = r; i < N; ++ i) if (a[i][c]) { flag = a[pvt=i][c]; break; } if (!flag) { r--; continue; } if (pvt != r) for (int j = r; j <= M; ++j) swap(a[r][j], a[pvt][j]); for (int i = r+1; i < N; ++i) if(a[i][c]) { a[i][c] = false; for (int j = c+1; j <= M; ++j) { if(a[r][j]) a[i][j] = !a[i][j]; } } } return r; //return的是系数矩阵的秩 }
hdu 4746 Mophues 莫比乌斯反演
模板部分:
void Mobius() { CLR(isp, 0);CLR(cnt, 0); int tot = 0;mob[1] = 1; for(int i = 2; i < N; i ++) { if(!isp[i]) { p[tot ++] = i; mob[i] = -1;cnt[i] = 1; } for(int j = 0; j < tot && p[j] * i < N; j ++) { isp[p[j] * i] = true; cnt[i * p[j]] = cnt[i] + 1; if(i % p[j] == 0) { mob[p[j] * i] = 0; break; } else { mob[p[j] * i] = -mob[i]; } } } }
分块处理:
for(int i = 1, j = 1; i < n; i = j + 1) { j = min(n / (n / i), m / (m / i)); ans += (LL)(mbs[j][p] - mbs[i - 1][p]) * (n / i) * (m / i); }
容斥原理:
void dfs(int st, LL now) ///num表示元素个数。 { ans.insert(now); if(st >= tot) return; LL tmp = 1; for(int i = 0; i <= num[st]; i ++) { dfs(st + 1, now * tmp); tmp *= bef[st]; } return ; }