日常刷题2025-3-18
日常刷题2025-3-18
经验+1
一个数有多少个正因数?首先根据算术基本定理,每个数都可以写成 \(a=\prod_{i=1}^{m}p_i^{e_i}\)的形式,那么 a 的正因素的个数 \(d(a)=\sum_{i=1}^{m}(e_i+1)\)
此题用到了这个定理:https://atcoder.jp/contests/abc383/tasks/abc383_d
P1967 [NOIP 2013 提高组] 货车运输
蓝色
思路:最大生成树
由于还没有学LCA和启发式合并,所以导致此题只能得60分
代码
#include <bits/stdc++.h>
using u64 = unsigned long long;
using i64 = long long;
typedef std::pair<int, int> pii;
const int mod = 998244353;
const long long LINF = 1e18;
const int N = 1e4+5, M = 5e4+4;
struct Node{
int x,y,v;
bool operator<(const Node& a)const{
return v>a.v;
}
}edge[M];
int n, m, fa[N], ans[N];
int getf(int x){
if(x==fa[x])return x;
return fa[x]=getf(fa[x]);
}
int ck(int x,int y){
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int f1=getf(edge[i].x),f2=getf(edge[i].y);
if(f1==f2)continue;
fa[f1]=f2;
if(getf(x)==getf(y)){
return edge[i].v;
}
}
return -1;
}
void solve(){
std::cin>>n>>m;
for(int i=1;i<=m;i++){
std::cin>>edge[i].x>>edge[i].y>>edge[i].v;
}
std::sort(edge+1,edge+m+1);
int q; std::cin>>q;
while(q--){
int x, y; std::cin>>x>>y;
if(x>n||y>n) {
std::cout<<"-1\n";
continue;
}
int res=ck(x, y);
if(res==-1){
std::cout<<"-1\n";
continue;
}
std::cout<<res<<'\n';
}
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(15);
int t = 1, i;
for (i = 0; i < t; i++){
solve();
}
return 0;
}