并查集:int finds(int x)//找老大
{
int j,d=x;
while(x!=a[x])
x=a[x];
while(a[d]!=x)
{
j=d;
d=a[d];
a[j]=x;
}
return x;
}
int merger(int a,int b)//合并老大
{
x[findd(a)]=findd(b);
}//x数组的值为老大,下标为小弟
int finds(int x)//找老大
{
int j,d=x;
while(x!=a[x])
x=a[x];
while(a[d]!=x)
{
j=d;
d=a[d];
a[j]=x;
}
return x;
}
int merger(int a,int b)//合并老大
{
x[findd(a)]=findd(b);
}//x数组的值为老大,下标为小弟丑数:#include<iostream>//若一个数的所有素因子是2、3、5、7中的一个或多个,则这个数成为Humble数。求第n个Humble数是多少。
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int x[100000];
int Min(int a,int b,int c,int d)
{
return min(a>b?b:a,c>d?d:c);
}
int main()
{
x[1]=1;
int a1=1,a2=1,a3=1,a4=1;
for(int i=2;i<=5842;i++)
{
x[i]=Min(2*x[a1],3*x[a2],5*x[a3],7*x[a4]);
if(x[i]==2*x[a1]) a1++;
if(x[i]==3*x[a2]) a2++;
if(x[i]==5*x[a3]) a3++;
if(x[i]==7*x[a4]) a4++;
}
int n;
while(~scanf("%d",&n)&&n)
{
printf("The %d",n);
if(n % 10 == 1 && n % 100 != 11)
printf("st");
else if(n % 10 == 2 && n % 100 != 12)
printf("nd");
else if(n % 10 == 3 && n % 100 != 13)
printf("rd");
else
printf("th");
printf(" humble number is %d.\n",x[n]);
}
}
#include<iostream>//若一个数的所有素因子是2、3、5、7中的一个或多个,则这个数成为Humble数。求第n个Humble数是多少。
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int x[100000];
int Min(int a,int b,int c,int d)
{
return min(a>b?b:a,c>d?d:c);
}
int main()
{
x[1]=1;
int a1=1,a2=1,a3=1,a4=1;
for(int i=2;i<=5842;i++)
{
x[i]=Min(2*x[a1],3*x[a2],5*x[a3],7*x[a4]);
if(x[i]==2*x[a1]) a1++;
if(x[i]==3*x[a2]) a2++;
if(x[i]==5*x[a3]) a3++;
if(x[i]==7*x[a4]) a4++;
}
int n;
while(~scanf("%d",&n)&&n)
{
printf("The %d",n);
if(n % 10 == 1 && n % 100 != 11)
printf("st");
else if(n % 10 == 2 && n % 100 != 12)
printf("nd");
else if(n % 10 == 3 && n % 100 != 13)
printf("rd");
else
printf("th");
printf(" humble number is %d.\n",x[n]);
}
}
函数全排:#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n,p[10],i;
while(scanf("%d",&n))
{
for(i=0; i<n; i++)
p[i]=i+1;
sort(p,p+n);
do
{
for(i=0; i<n; i++)
printf("%d ",p[i]);
printf("\n");
}
while(next_permutation(p,p+n));
}
}
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n,p[10],i;
while(scanf("%d",&n))
{
for(i=0; i<n; i++)
p[i]=i+1;
sort(p,p+n);
do
{
for(i=0; i<n; i++)
printf("%d ",p[i]);
printf("\n");
}
while(next_permutation(p,p+n));
}
}
逆元:long long inv(long long a,long long mod)
{
return a==1?1:inv(mod%a,mod)*(mod-mod/a)%mod;
}
long long inv(long long a,long long mod)
{
return a==1?1:inv(mod%a,mod)*(mod-mod/a)%mod;
} 全排列:#include<stdio.h>
#include<string.h>
void fun(int n,int a[],int c)
{
int i,j;
if(c==n)
{
for(i=0; i<n; i++)
printf("%d",a[i]);
printf("\n");
}
else for(i=1; i<=n; i++)
{
int f=1;
for(j=0; j<c; j++)
if(a[j]==i)
f=0;
if(f)
{
a[c]=i;
fun(n,a,c+1);
}
}
}
int main()
{
int nn;
scanf("%d",&nn);
while(nn--)
{
int n;
scanf("%d",&n);//n的全排列
int c=0,a[10];
fun(n,a,c);
}
}
#include<stdio.h>
#include<string.h>
void fun(int n,int a[],int c)
{
int i,j;
if(c==n)
{
for(i=0; i<n; i++)
printf("%d",a[i]);
printf("\n");
}
else for(i=1; i<=n; i++)
{
int f=1;
for(j=0; j<c; j++)
if(a[j]==i)
f=0;
if(f)
{
a[c]=i;
fun(n,a,c+1);
}
}
}
int main()
{
int nn;
scanf("%d",&nn);
while(nn--)
{
int n;
scanf("%d",&n);//n的全排列
int c=0,a[10];
fun(n,a,c);
}
}
数学公式求三角形面积:int area(int x1,int y1,int x2,int y2,int x3,int y3)//逆时针正,顺时针负,面积为三角形面积的2倍
{
return abs(x1*y2+x3*y1+x2*y3-x3*y2-x1*y3-x2*y1);
}
int judgemax(int a,int b,int c)
{
return a>b?a>c?a:b>c?b:c:b>c?b:a>c?a:c;
}
int judgemin(int a,int b,int c)
{
return a<b?a<c?a:b<c?b:c:b<c?b:a<c?a:c;
}
S=sqrt(p*(p-a)(p-b)(p-c))//p=(a+b+c)/2,a,b,c为三边长
int area(int x1,int y1,int x2,int y2,int x3,int y3)//逆时针正,顺时针负,面积为三角形面积的2倍
{
return abs(x1*y2+x3*y1+x2*y3-x3*y2-x1*y3-x2*y1);
}
int judgemax(int a,int b,int c)
{
return a>b?a>c?a:b>c?b:c:b>c?b:a>c?a:c;
}
int judgemin(int a,int b,int c)
{
return a<b?a<c?a:b<c?b:c:b<c?b:a<c?a:c;
}
S=sqrt(p*(p-a)(p-b)(p-c))//p=(a+b+c)/2,a,b,c为三边长文件输入输出: freopen("Input.txt","r",stdin);
freopen("Output.txt","w",stdout);
freopen("Input.txt","r",stdin);
freopen("Output.txt","w",stdout);线性欧拉函数筛法:/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/
int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数
int make()
{
phi[1]=1;
int N=maxn;
int k;
for(int i=2;i<N;i++)
{
if(!m[i])//i是素数
p[pt++]=m[i]=i,phi[i]=i-1;
for(int j=0;j<pt&&(k=p[j]*i)<N;j++)
{
m[k]=p[j];
if(m[i]==p[j])//为了保证以后的数不被再筛,要break
{
phi[k]=phi[i]*p[j];
/*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/
break;
}
else
phi[k]=phi[i]*(p[j]-1);//积性函数性质,f(i*k)=f(i)*f(k)
}
}
}
/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/
int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数
int make()
{
phi[1]=1;
int N=maxn;
int k;
for(int i=2;i<N;i++)
{
if(!m[i])//i是素数
p[pt++]=m[i]=i,phi[i]=i-1;
for(int j=0;j<pt&&(k=p[j]*i)<N;j++)
{
m[k]=p[j];
if(m[i]==p[j])//为了保证以后的数不被再筛,要break
{
phi[k]=phi[i]*p[j];
/*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/
break;
}
else
phi[k]=phi[i]*(p[j]-1);//积性函数性质,f(i*k)=f(i)*f(k)
}
}
}2种素数筛法: //普通筛法
for(i=2; i<=n; i++)
{
if(a[i]!=0)
for(j=i+i; j<=n; j+=i)
a[j]=0;
}
//线性筛法
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
int cont=0;
for(int i=2; i<1001000; i++ )
{
if(!x[i])
y[cont++]=i;
for(int j=0; j<=cont&&i*y[j]<1001000; j++)
{
x[i*y[j]]=1;
if(!(i%y[j]))
break;
}
}
//普通筛法
for(i=2; i<=n; i++)
{
if(a[i]!=0)
for(j=i+i; j<=n; j+=i)
a[j]=0;
}
//线性筛法
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
int cont=0;
for(int i=2; i<1001000; i++ )
{
if(!x[i])
y[cont++]=i;
for(int j=0; j<=cont&&i*y[j]<1001000; j++)
{
x[i*y[j]]=1;
if(!(i%y[j]))
break;
}
}

本文涵盖多种核心算法实现,包括并查集、全排列、逆元计算等,并提供了求解特定数学问题的方法,如丑数计算及三角形面积计算。
23万+

被折叠的 条评论
为什么被折叠?



