以下为笔者学习过程中记录的模板资料,仅记录
快速幂模板
ll ksm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
欧拉函数(求小于a且与a互质的数的个数)
ll Eular(ll a){//求小于a与a互质的数
ll ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0){
n/=i;
}
}
}
if(n>1){
ans=ans/n*(n-1);
}
return ans;
}
欧拉筛,筛素数
bool isPrime[100000010];//isPrime[i] == 1表示:i是素数
ll Prime[6000010], cnt = 0;//Prime存质数
void GetPrime(ll n)//筛到n
{
memset(isPrime, 1, sizeof(isPrime));
//以“每个数都是素数”为初始状态,逐个删去
isPrime[1] = 0;//1不是素数
for(ll i = 2; i <= n; i++)
{
if(isPrime[i])//没筛掉
Prime[++cnt] = i; //i成为下一个素数
for(ll j = 1; j <= cnt && i*Prime[j] <= n/*不超上限*/; j++)
{
//从Prime[1],即最小质数2开始,逐个枚举已知的质数,并期望Prime[j]是(i*Prime[j])的最小质因数
//当然,i肯定比Prime[j]大,因为Prime[j]是在i之前得出的
isPrime[i*Prime[j]] = 0;
if(i % Prime[j] == 0)//i中也含有Prime[j]这个因子
break; //重要步骤。见原理
}
}
}
并查集模板
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void unionn(int x,int y)
{
int a=find(x);
int b=find(y);
father[a]=b;
}
动态规划——一维dp(背包问题)
cin>>time>>n;
for(int i=1;i<=n;i++){
cin>>t[i]>>v[i];
}
for(int i=1;i<=n;i++){
for(int j=time;j>=t[i];j--){//time为限制条件
dp[j]=max(dp[j],dp[j-t[i]]+v[i]);
}
}
cout<<dp[time];
博弈论——威佐夫博弈(简单博弈论)
cin>>n>>m;
if(n<m)swap(n,m);
if(floor((1+sqrt(5))/2*(n-m))==m){//向下取整
cout<<"1";//先手必败
}else{
cout<<"2";//后手必败
}
数论——区间素数的个数(洛谷模板题P1865,他的名字就是骗人的,题目内容和标题无关)A % B problem
const ll N = 1e6+10;
int a[N];
bool vis[N];
int n,m;
void shai()
{
a[1] = 0;
vis[1] = 1;
for(int i = 2;i <= n;i++){
if(!vis[i]){
a[i] = a[i-1]+1;
for(int j = i*2;j <= n;j=j+i){
vis[j] = 1;
}
}
else{
a[i] = a[i-1];
}
}
}
KMP算法模板求next数组
void ini()
{
nxt[0] = -1;
int k = -1, i = 0;
while (i < s2.size())
{
if (k == -1 || s2[k] == s2[i])
{
i++;
k++;
nxt[i] = k;
}
else
{
k = nxt[k];
}
}
}