模板部分:
#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 6170 Esspe-Peasee 扩展欧几里得算法
模板部分:
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 ;
}
错排公式。(摘自百科)
当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有M(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法;
综上得到
M(n)=(n-1)[M(n-2)+M(n-1)]
特殊地,M⑴=0,M⑵=1
下面通过这个递推关系推导通项公式:
为方便起见,设M(k)=k!N(k),(k=1,2,…,n)
则N⑴=0,N⑵=1/2
n>=3时,n!N(n)=(n-1)(n-1)!N(n-1)+(n-1)!N(n-2)
即 nN(n)=(n-1)N(n-1)+N(n-2)
于是有N(n)-N(n-1)=-[N(n-1)-N(n-2)]/n=(-1/n)[-1/(n-1)][-1/(n-2)]…(-1/3)[N⑵-N⑴]=(-1)^n/n!
因此
N(n-1)-N(n-2)=(-1)^(n-1)/(n-1)!
N⑵-N⑴=(-1)^2/2!
相加,可得
N(n)=(-1)^2/2!+…+(-1)^(n-1)/(n-1)!+(-1)^n/n!
因此
M(n)=n![(-1)^2/2!+…+(-1)^(n-1)/(n-1)!+(-1)^n/n!]
可以得到
错排公式为M(n)=n!(1/2!-1/3!+…..+(-1)^n/n!)
梅森素数 from 百科
序号
|
p
|
Mp=2^p-1
|
Mp的位数
|
发现时间
|
发现者
|
1
|
2
|
3
|
1
|
古代
|
古人
|
2
|
3
|
7
|
1
|
古代
|
古人
|
3
|
5
|
31
|
2
|
古代
|
古人
|
4
|
7
|
127
|
3
|
古代
|
古人
|
5
|
13
|
8191
|
4
|
1456年
|
无名氏
|
6
|
17
|
131071
|
6
|
1588年
|
Cataldi
|
7
|
19
|
524287
|
6
|
1588年
|
Cataldi
|
8
|
31
|
2147483647
|
10
|
1772年
|
|
9
|
61
|
23058430092
|
19
|
1883年
|
Pervushin
|
10
|
89
|
618970019…449562111
|
27
|
1911年
|
|
11
|
107
|
162259276…010288127
|
33
|
1914年
|
Powers
|
12
|
127
|
170141183…884105727
|
39
|
1876年
|
|
13
|
521
|
686479766…115057151
|
157
|
1952年1月30日
|
|
14
|
607
|
531137992…031728127
|
183
|
1952年1月30日
|
Robinson
|
15
|
1,279
|
104079321…168729087
|
386
|
1952年6月25日
|
Robinson
|
16
|
2,203
|
147597991…697771007
|
664
|
1952年10月7日
|
Robinson
|
17
|
2,281
|
446087557…132836351
|
687
|
1952年10月9日
|
Robinson
|
18
|
3,217
|
259117086…909315071
|
969
|
1957年9月8日
|
Riesel
|
19
|
4,253
|
190797007…350484991
|
1,281
|
1961年11月3日
|
Hurwitz
|
20
|
4,423
|
285542542…608580607
|
1,332
|
1961年11月3日
|
Hurwitz
|
21
|
9,689
|
478220278…225754111
|
2,917
|
1963年5月11日
|
Gillies
|
22
|
9,941
|
346088282…789463551
|
2,993
|
1963年5月16日
|
Gillies
|
23
|
11,213
|
|