求最大公约数
int gcd(int a,int b)
{
if(a % b == 0)return b;
return gcd(b,a % b);
}
求最小公倍数
a/gcd(a,b)*b
求所有约数
int t=gcd(a,b);
for(int i=1;i*i<=t;i++)
{
if(t%i==0)
{
s[++idx]=i;
if(i!=t/i) s[++idx]=t/i;
}
}
求所有质约数
for(int i=1;i<=t/i;i++)
{
if(t%i==0)
{
s[++idx]=i;
while(t%i==0) t/=i;
}
}
if(t>1) s[++idx]=t;
埃氏筛法O(nlog(log(n)))
const int N=1e5+10;
bool st[N],is_primes[N];
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(st[i]==0)
{
is_primes[i]=1;
for(int j=1;j<=n/i;j++) st[j*i]=1;
}
}
}
线性筛O(n)
int primes[N],idx=0;
bool st[N];
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(st[i]==0) primes[++idx]=i;
for(int j=1;j<=idx;j++)
{
st[primes[j]*i]=1;
if(i%primes[j]==0) break;
}
}
}
筛法求欧拉函数
int primes[N],idx=0;
bool st[N];
int ouler[N];
void get_primes(int n)
{
ouler[1]=1;
for(int i=2;i<=n;i++)
{
if(st[i]==0)
{
primes[++idx]=i;
ouler[i]=i-1;
}
for(int j=1;j<=idx;j++)
{
st[primes[j]*i]=1;
if(i%primes[j]==0)
{
ouler[primes[j]*i]=primes[j]*ouler[i];
break;
}
ouler[primes[j]*i]=(primes[j]-1)*ouler[i];
}
}
}
快速幂
ll a,b,p;
ll qmi(ll a,ll b)
{
ll res = 1 ;
while (b)
{
if (b&1) res = ((res%p) * (a% p))%p;
a = (a%p) * (a % p)%p;
b >>= 1;
}
return res%p;
}
拓扑排序
#include<iostream>
#include<cstring>
using namespace std;
const int N=2e5+10;
int h[N],e[N],ne[N],idx,cnt[N],q[N];
int n,m;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool top_sort(){
int hh=0,tt=-1;
for(int i=1;i<=n;i++){
if(!cnt[i]){
q[++tt]=i;
}
}
while(hh<=tt){
int t=q[hh++];
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
cnt[j]--;
if(!cnt[j]) q[++tt]=j;
}
}
return tt==n-1;
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
add(a,b);
cnt[b]++;
}
if(top_sort()){
for(int i=0;i<n-1;i++) cout<<q[i]<<" ";
cout<<q[n-1]<<endl;
}else cout<<-1<<endl;
}