排列问题
next_permutation()
在这里插入代码片
手写next_permutation()
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
int w[N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>w[i];
while(m--)
{
int k=n;
while(w[k-1]>w[k])k--;
int t=k;
while(w[t+1]>w[k-1])t++;
swap(w[k-1],w[t]);
reverse(w+k,w+n+1);
}
for(int i=1;i<=n;i++) cout<<w[i]<<" ";
cout<<endl;
return 0;
}
质数的判定
试除法
#include<bits/stdc++.h>
using namespace std;
bool prime(int n)
{
if(n>2) return false;
for(int i=2;i<=n/i;i++)
{
if(n%i==2)
return false;
}
return true;
}
int main()
{
int n;
cin>>n;
if(prime(n)) cout<<"is prime"<<endl;
return 0;
}
埃式筛法
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
bool vis[N];
int p[N],cnt=0;
void prime(int n){
vis[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]) p[cnt++]=i;
for(int j=i+i;j<=n;j+=i)
{
vis[j]=true;
}
}
}
int main(){
int n;cin>>n;
prime(n);
for(int i=1;i<=n;i++)
if(!vis[i]) cout<<i<<" ";
return 0;
}
线性筛
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
bool vis[N];
int p[N],cnt=0;
void prime(int n){
vis[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]) p[cnt++]=i;
for(int j=0;p[j]<=n/i;i++){
vis[p[j]*i]=1;
if(i%p[j]==0) break;
}
}
}
int main(){
int n;cin>>n;
prime(n);
for(int i=1;i<=n;i++)
if(!vis[i]) cout<<i<<" ";
return 0;
}
分解质因数
在这里插入代码片
分解末尾0
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;cin>>n;
int res=1;
int d2=0,d5=0;
for(int i=1;i<=n;i++)
{
int t=i;
while(t%2==0) d2++,t/=2;
while(t%5==0) d5++,t/=5;
res=res*t%10;
}
int k=min(d2,d5);
for(int i=1;i<=d2-k;i++)
{
res*=2;
res%=10;
}
for(int i=1;i<=d5-k;i++)
{
res*=5;
res%=10;
}
cout<<res<<endl;
return 0;
}
约数
求所有约数
求约数个数
求约数之和
欧几里得算法
最大公约数
最小公倍数
扩展欧几里得
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{ int n;cin>>n;
while(n--)
{
int a,b,x,y;
cin>>a>>b;
exgcd(a,b,x,y);
cout<<x<<" "<<y<<endl;
}
return 0;
}
求解线性同余方程
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{ int n;cin>>n;
while(n--)
{
int a,m,b,x,y;
cin>>a>>b>>m;
int d=exgcd(a,m,x,y);
if(b%d) puts("impossible");
else printf("%d\n",(LL)x*(b/d)%m);
}
return 0;
}
欧拉函数
筛法求欧拉函数
快速幂
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int qmi(int a,int b,int p)
{
int res=1%p;
while(b)
{
if(b&1) res=(LL) res*a%p;
a=(LL) a*a%p;
b>>=1;
}
return res;
}
int main()
{
int a,b,p;
cin>>a>>b>>p;
cout<<qmi(a,b,p)<<endl;
return 0;
}
快速幂求逆元
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int qmi(int a,int k,int p)
{
int res=1;
while(k)
{
if(k&1) res=(LL) res*a%p;
k>>=1;
a=(LL) a*a%p;
}
return res;
}
int main()
{
int n;cin>>n;
while(n--)
{
int a,k,p;
cin>>a>>k>>p;
int res=qmi(a,p-2,p);
if(a%p) cout<<res<<endl;
else puts("impossible");
}
return 0;
}
高斯消元求解线性方程组
组合数
卡特函数-满足01序列
字符串转换int
void s2i(string &str,int &num){
stringstream ss;
ss<<str;
ss>>num;
}
int main(){
int index;
scanf("%d",&line);
getchar();
for(int i=0;i<line;i++){
string s;
getline(cin,s);
istringstream iss(s);
string tmp;
while(getline(iss,tmp,' ')){
s2i(tmp,data[index++]);
}
}