problem k-th divisor
describe
你被给了两个整数n 和k 。找到n 的第k 小因子,或者告知其不存在。
任意一个可以除n 而没有余数的自然数都是n 的因子。
#include <bits/stdc++.h>
using namespace std;
long long n;
long long k, p[10000010], cnt;
int main() {
cin >> n >> k;
p[1] = 1;
cnt = 1;
if (n != 1) p[2] = n, cnt = 2;//特判1
for (register long long i = 2; i <= sqrt(n); ++i) {
if (n % i == 0) {
p[++cnt] = i;
if (i != n / i) p[++cnt] = n / i;
}
}//筛出他的约数
sort(p + 1, p + cnt + 1);
if (k <= cnt) cout << p[k];
else puts("-1");//dssdsds
}
problem polanball and forest
describe
给你一张图以及距离每个点的最远的和该点在同一连通块的节点。求这张图中连通块的个数。
#include<cstdio>
#include<set>
using namespace std;
int n,fa[10001],ra[10001];
set<int> ans;//STL大法好
void Init(){
for(int i=1;i<=n;++i) fa[i]=i;
}
int find(int u){
if(u==fa[u]) return u;
return fa[u]=find(fa[u]);
}
void join(int u,int v){
int fu=find(u),fv=find(v);
if(fu==fv) return ;
if(ra[fu]>ra[fv]){
fa[fv]=fu;
} else {
fa[fu]=fv;
}
return ;
}
int main(){
scanf("%d",&n);
Init();
for(int i=1,f;i<=n;++i){
scanf("%d",&f);
join(i,f);//合并集合
}
for(int i=1;i<=n;++i) ans.insert(find(i));//加入set
printf("%d\n",ans.size());
return 0;
}
problem bash’s big day
describe
Bash 作为一个聪明的人,不希望他的口袋妖怪互相斗争。然而,他也想最大化他从实验室里带走的神奇宝贝的数量。你能帮 Bash 找出他能带走的最大数量的口袋妖怪吗?
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
int cou[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
for (int j = 1; j * j<= x; ++j) {
if (x % j == 0) {
++cou[j];
if (j * j != x) {
++cou[x / j];
}
}
}
}
int ans = 1;
for (int i = 2; i < N; ++i) {
ans = max(ans, cou[i]);
}
printf("%d", ans);
}