https://vjudge.net/contest/537529#problem/A
给定一个整数k,1<=x<k,求最大的x,使得x!+(x-1)!是k的整数倍。
![](https://i-blog.csdnimg.cn/blog_migrate/16b8d5152ff1903c2c66d0333bdd8993.png)
x!=x*(x-1)!,所以x!+(x-1)!=(x+1)*x!,令x=k-1,则该条件恒成立,所以直接输出k-1即可。
https://vjudge.net/contest/537529#problem/F
有N首歌,每首歌的时间是ti,若所有歌放完,从头开始,输出T时刻放到了第几首歌,放到了第几秒
![](https://i-blog.csdnimg.cn/blog_migrate/f2e83028acf278ecd924195fdc3f066b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b5c9fc28018764ff9290245292fe903.png)
值得注意的是T可能超过int范围,由于歌曲按顺序循环播放,所以用sum记载歌曲时间和,再用T%sum,得到一个循环类的时间T,只要T>ti这样就到了下一首,剩下T-ti的时间,直到T<ti;
#include<stdio.h>
int a[100001];
int main()
{
int n,num=1;
long long sum=0,t;
scanf("%d %lld",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%d ",&a[i]);
sum+=a[i];
}
t=t%sum;
while(t>a[num])
{
t-=a[num];
num++;
}
printf("%d %lld",num,t);
}
![](https://i-blog.csdnimg.cn/blog_migrate/4afa793946865df972962e911ae38671.png)
有N个点和M条边,M条边分别将点ui,vi连接起来,求M个点最后成为几个部分
![](https://i-blog.csdnimg.cn/blog_migrate/a66d42253f7409041ac0eb4aab778706.png)
用并查集,最后有几个跟节点就有几个部分,
#include<stdio.h>
int a[200],b[200];
int find(int x)
{
if(a[x]==x) return x;
else
{
a[x]=find(a[x]);
return find(a[x]);
}
}
void marge(int x,int y)
{
x=find(x);
y=find(y);
a[x]=y;
}
int main()
{
int m,n,x,y,num=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) a[i]=i;
while(m--)
{
scanf("%d%d",&x,&y);
marge(x,y);
}
for(int i=1;i<=n;i++)
{
b[find(i)]=1;
}
for(int i=0;i<=n;i++)
{
if(b[i]>0) num+=1;
}
printf("%d",num);
}