NOIP2018模板总结【数学】

2023-11-01 13:59
文章标签 模板 总结 数学 noip2018

本文主要是介绍NOIP2018模板总结【数学】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

质因数分解

//质因数分解
int prime[MAXN], tim[MAXN], cnt;
void Divide(int N)
{printf("%d = ", N);for(int i = 2; i * i <= N; i++) if(N % i == 0){prime[++cnt] = i;while(N % i == 0) N /= i, tim[cnt]++;}if(N > 1) prime[++cnt] = N, tim[cnt] = 1;printf("%d^%d", prime[1], tim[1]);for(int i = 2; i <= cnt; i++)printf(" * %d^%d", prime[i], tim[i]);
}

线性筛素数/欧拉函数

线性筛素数/欧拉函数
int phi[MAXN], prime[MAXP], cnt;
bool vis[MAXN];
void Prime(int N)
{phi[1] = 1;for(int i = 2; i <= N; i++){if(!vis[i]) prime[++cnt] = i, phi[i] = i-1;for(int j = 1; j <= cnt && i*prime[j] <= N; j++){vis[i*prime[j]] = true;if(i % prime[j] == 0) { phi[i*prime[j]] = phi[i] * prime[j]; break; }phi[i*prime[j]] = phi[i] * (prime[j]-1);}}
}

Miller-Robin大素数测试/快速幂/快速乘

​//Miller-Robin大素数测试
#define LL long long
//O(1)快速乘(模)
LL kmul(LL a,LL b,LL P)
{a = (a % P + P) % P,b = (b % P + P) % P;return ((a * b - (LL)((long double)a / P * b + 1e-6) * P) % P + P) % P;
}
//O(logn)快速幂
LL kpow(LL a, LL b, LL mod)
{LL ret = 1;while(b){if(b & 1) ret = kmul(ret, a, mod);a = kmul(a, a, mod); b >>= 1;}return ret;
}
bool Mil_Rb(LL N, LL a)
{LL d = N-1; int s = 0;while(!(d & 1))d >>= 1, s++;LL t = kpow(a, d, N);if(t == 1 || t == -1) return true;for(int i = 0; i < s; i++){if(t == N-1) return 1;t = kmul(t, t, N);}return 0;
}
bool isPrime(LL N)
{if(N == 2) return true;if(N == 1 || !(N & 1)) return false;LL a[5] = { 2, 3, 5, 7, 11 };for(int i = 0; i < 5; i++){if(N == a[i]) return true;if(!(N % a[i])) return false;if(N > a[i] && !Mil_Rb(N, a[i])) return false;}return true;
}

gcd & lcm

//gcd & lcm
LL gcd(LL a, LL b) { return b ? gcd(b, a%b) : a; }
LL lcm(LL a, LL b) { return a / gcd(a, b) * b; }

exgcd

//a*x + b*y = b*y + (a%b)*x + (a/b)*b*x
//          = b*(y+x*(a/b)) + (a%b)*x
#define LL long long
void exgcd(LL a, LL b, LL &x, LL &y, LL &gcd)
{if(!b) { x = 1, y = 0; gcd = a; return; }exgcd(b, a%b, y, x, gcd); y -= x * (a/b);
}

中国剩余定理

//中国剩余定理
void exgcd(int a, int b, int &x, int &y)
{if(!b) { x = 1; y = 0; return; }exgcd(b, a%b, y, x); y -= x*(a/b);
}
int CRT(int *W, int *B, int k) // W > B
{int x, y, mulsum = 1, ans = 0;for(int i = 1; i <= k; i++)mulsum *= W[i];for(int i = 1; i <= k; i++){int M = mulsum/W[i];exgcd(W[i], M, x, y);ans = (ans + y*M*B[i]) % mulsum;}if(ans < 0) ans += mulsum;return ans;
}

卡特兰数

// ksm(a, mod-2)在mod为素数的情况下≡a^(-1),即a在mod下的逆元

//Catalan
const int MAXN = 5005;
int Catalan[MAXN];
int pre()
{Catalan[0] = 1;for(int i = 1; i < MAXN; i++)for(int j = 0; j < i; j++)Catalan[i] = (Catalan[i] + (LL)Catalan[j] * Catalan[i-j-1]  %mod) % mod;//						orfor(int i = 1; i < MAXN; i++)Catalan[i] = (LL)Catalan[i-1] * (4*i-2) % mod * ksm(n+1, mod-2);
}
int Catalan(int n)
{return C(n<<1, n) * ksm(n+1, mod-2);//						orreturn (C(n<<1, n) - C(n<<1, n-1)) % mod + mod) % mod;
}

康托展开式

LL Fac[21];
//预处理阶乘(20!在longlong范围内而21!爆longlong)
inline void init()
{Fac[0] = Fac[1] = 1;for(int i = 2; i <= 20; i++)Fac[i] = Fac[i-1] * i;
}
//康托展开
inline LL cantor(vector<int>A, int n)//即求字典序小于此排列的个数
{LL ret = 0; //答案从0 ~ n!-1for(int i = 0; i < n; i++){int k = 0;for(int j = i+1; j < n; j++)//求逆序对if(A[i] > A[j]) k++;ret += Fac[n-i-1] * k;}return ret;
}
//逆康托
vector<int> decantor(LL x, int n)
{vector<int>left, ret;for(int i = 1; i <= n; i++) left.push_back(i); //存剩下的数字for(int i = n; i >= 1; i--){int q = x/Fac[i-1];x %= Fac[i-1];ret.push_back(left[q]);left.erase(left.begin()+q); //删除}return ret;
}

N的(随机/全)排列

//Random
srand(time(NULL));
int num[MAXN], n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)num[i] = i;
random_shuffle(num + 1, num + n + 1);
for(int i = 1; i <= n; i++)printf("%d ", num[i]);//All
int num[MAXN], n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)num[i] = i;
do {for(int i = 1; i <= n; i++)printf("%d ", num[i]);putchar('\n');
}while(next_permutation(num + 1, num + n + 1));

N的R排列

int seq[MAXN], N, R;
inline void Print()
{for(int i = 1; i <= R; i++)printf("%d%c", seq[i], i == R ? '\n' : ' ');
}
bool vis[MAXN];
inline void dfs(int now) //N的R排列
{if(now > R){Print();return;}for(int i = 1; i <= N; i++)if(!vis[i]){vis[i] = 1;seq[now] = i; dfs(now+1);vis[i] = 0;}
}

N的R排列(可重复)

int seq[MAXN], N, R;
inline void Print()
{for(int i = 1; i <= R; i++)printf("%d%c", seq[i], i == R ? '\n' : ' ');
}
inline void dfs(int now) //N的R排列(可重复)
{if(now > R){Print();return;}for(int i = 1; i <= N; i++)seq[now] = i, dfs(now+1);
}

N的R组合(可重复)

int seq[MAXN], N, R;
inline void Print()
{for(int i = 1; i <= R; i++)printf("%d%c", seq[i], i == R ? '\n' : ' ');
}
inline void dfs(int now) //N的R组合(可重复)
{if(now > R){Print();return;}for(int i = max(seq[now-1], 1); i <= N; i++)seq[now] = i, dfs(now+1);
}

第一类斯特林数(有/无符号)   

LL Su[MAXN][MAXN]; //无符号第一类斯特林数
LL Ss[MAXN][MAXN]; //有符号第一类斯特林数
inline void init()
{Su[0][0] = 1; //CAUTIONfor(int i = 1; i < MAXN; i++) //即n个不同元素构成m个圆排列的方案数{Su[i][0] = 0; //CAUTIONfor(int j = 1; j <= i; j++)Su[i][j] = (Su[i-1][j-1] + Su[i-1][j]*(i-1)) % mod;}Ss[0][0] = 1; //CAUTIONfor(int i = 1; i < MAXN; i++){Ss[i][0] = 0; //CAUTIONfor(int j = 1; j <= i; j++)Ss[i][j] = (Ss[i-1][j-1] - Ss[i-1][j]*(i-1)) % mod;}
}

“pascal”三角形

二项式系数  可以构成一个杨辉三角(pascal三角形)。同样第一类Stirling数同样也可以构成一个三角,可以由此分析其性质。

 无符号Stirling数有符号Stirling数
n=011
n=10 10 1
n=20 1 10 -1 1
n=30 2 3 10 2 -3 1
n=40 6 11 6 10 -6 11 -6 1
n=50 24 50 35 10 10 24 -50 35 -10 1
n=60 120 274 225 85 15 10 -120 274 -225 85 -15 1
n=70 720 1764 1624 735 175 21 10 720 -1764 1624 -735 175 -21 1

性质

无符号Stirling数有如下性质:

① 

② 

③ 

④ 

⑤ 

⑥ 

⑦ 

⑧  

有符号stirling性质类似:

① 

②  ,注意  

以上摘自万能的百度百科

第二类斯特林数  

LL S[MAXN][MAXN];
inline void init()
{S[0][0] = 1;for(int i = 1; i < MAXN; i++){S[i][0] = 0;for(int j = 1; j <= i; j++)S[i][j] = (S[i-1][j-1] + S[i-1][j] * j) %mod;}
}

“pascal”三角形

n=01
n=10 1
n=20 1 1
n=3

0 1 3 1

n=4

0 1 7 6 1

n=5

0 1 15 25 10 1

n=6

0 1 31 90 65 15 1

n=7

0 1 63 301 350 140 21 1

n=8

0 1 127 966 1701 1050 266 28 1

n=9

0 1 255 3025 7770 6951 2646 462 36 1

性质

① 注意  

② 

③ 

④ 

⑤ 

⑥ 

⑦ 

⑧ 

⑨  ,  是贝尔数。

    由    推出

    其中Ⅰ.     实际上为【n个不同的球,放入m个有区别的盒子,允许盒子为空】的方案数

           Ⅱ.     为【n个不同的球,放入m个无区别的盒子,允许盒子为空】的方案数

    因为Ⅰ的盒子有区别,所以用Ⅱ乘上排列即为Ⅰ,Ⅰ=   。

    又因为Ⅰ中每个球有m种选择且相互独立,Ⅰ= 

                ∵Ⅰ = Ⅰ

                ∴  

推论

       (1) 若n<m,  ,因为S(n, m) = 0

       (2)  ,因为S(m, m) = 1

以上摘自万能的百度百科

贝尔数

LL B[MAXN];
void init()
{for(int i = 1; i < MAXN; i++){for(int j = 0; j < i; j++) //CAUTIONB[i] = (B[i] + B[j]*C(i, j))%mod;//C -> 组合数orfor(int j = 1; j <= i; j++) //CAUTIONB[i] = (B[i] + S(i, j))%mod;//S -> 第二类斯特林数}
}
//同时适合"Touchard同余"
//B(n+p) ≡ B(n) + B(n+1) (mod p)

Lucas定理

// C(n, m) ≡ C(n/p, m/p) * C(n%p, m%p) (mod p) p为质数
LL Lucas(LL n, LL m, LL p)
{return Lucas(n/p, m/p) * C(n%p, m%p) % p;
}

枚举子集(二进制输出)

int s, all;
scanf("%d", &all); s = all;
do {cout<<bitset<N>(s)<<endl;
}while(s && (--s&=all, 1));

 

这篇关于NOIP2018模板总结【数学】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/323475

相关文章

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注