C.Four Variables
从正整数中,找出合适的ABCD,使得这个式子成立\(AB+CD=N\)。
可以看到,A与B是相互关联的,C与D是相互关联的,所以我们可以在小于N的正整数中,找寻可以相加的两个数,并且这两个数都可以分别表示为两个整数相乘,分别统计,同时注意AB的无序性即可。
下见代码:
//>>>Qiansui
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;
void solve(){
ll n,x,y,ans=0,cnta,cntc;
cin>>n;
for(ll i=1;i<n;++i){
x=i;y=n-i;
cnta=cntc=0;
for(ll j=1;j*j<=x;++j){
if(x%j==0){
++cnta;
if(x!=j*j) ++cnta;
}
}
for(ll j=1;j*j<=y;++j){
if(y%j==0){
++cntc;
if(y!=j*j) ++cntc;
}
}
ans+=cnta*cntc;
}
cout<<ans<<"\n";
return ;
}
signed main(){
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _=1;
// cin>>_;
while(_--){
solve();
}
return 0;
}
D.Unicyclic Components
给一个无向图,判断所有的连通分支,是否都满足定点数等于边数。
利用并查集判断连通性,同时统计各连通分支是否满足条件即可。
下见代码:
//>>>Qiansui
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;
int n,m,fa[maxm],cntm[maxm];
void pre(){
for(int i=0;i<n;++i)
fa[i]=i;
return ;
}
int findfa(int t){
if(fa[t]==t) return t;
else return fa[t]=findfa(fa[t]);
}
void solve(){
int y,a,b;
cin>>n>>m;
pre();
for(int i=0;i<m;++i){
cin>>cntm[i]>>y;
a=findfa(cntm[i]-1);
b=findfa(y-1);
if(a!=b){
fa[a]=b;
}
}
if(n!=m){
// cout<<".1..\n";
cout<<"No\n";
return ;
}
vector<int> d(n,0),e(n,0);
for(int i=0;i<n;++i){
++d[findfa(i)];
}
for(int i=0;i<m;++i){
++e[findfa(cntm[i]-1)];
}
if(d==e) cout<<"Yes\n";
else cout<<"No\n";
return ;
}
signed main(){
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _=1;
// cin>>_;
while(_--){
solve();
}
return 0;
}
E.Transitivity
题意是构造给定关系的传递闭包,就是将给定有向图的a->b,b->c但无a->c的补充一条有向边,使得对于任意不同的abc都有这个成立。怎么说呢,如果去模拟上面所说过程,那么时间复杂度不能满足题目的要求。其实题目根本的意思就是,对于一个顶点a,与其连通的所有顶点,a都有一条边与其相连,所以我们可以用BFS/DFS来求解。
下见代码:
//>>>Qiansui
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
using namespace std;
const int maxm=2e3+5,inf=0x3f3f3f3f,mod=998244353;
int n,m;
void solve(){
cin>>n>>m;
ll u,v,ans=0,t;
vector<int> map[n+1];
for(int i=0;i<m;++i){
cin>>u>>v;
map[u].push_back(v);
}
queue<int> q;
for(int i=1;i<=n;++i){//vertices
vector<int> vis(n+1,0);
vis[i]=1;
q.push(i);
while(!q.empty()){
t=q.front();
q.pop();
vis[t]=1;
for(int j=0;j<map[t].size();++j){
u=map[t][j];
if(vis[u]) continue;
vis[u]=1;
q.push(u);
++ans;
}
}
}
cout<<ans-m<<'\n';
return ;
}
signed main(){
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _=1;
// cin>>_;
while(_--){
solve();
}
return 0;
}
标签:AtCoder,ch,Beginner,ll,long,while,include,292,define
From: https://www.cnblogs.com/Qiansui/p/17190023.html